| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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_url_loader.h" | 5 #include "ppapi/tests/test_url_loader.h" |
| 6 | 6 |
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 int32_t WriteEntireBuffer(PP_Instance instance, | 33 int32_t WriteEntireBuffer(PP_Instance instance, |
| 34 pp::FileIO* file_io, | 34 pp::FileIO* file_io, |
| 35 int32_t offset, | 35 int32_t offset, |
| 36 const std::string& data) { | 36 const std::string& data) { |
| 37 TestCompletionCallback callback(instance); | 37 TestCompletionCallback callback(instance); |
| 38 int32_t write_offset = offset; | 38 int32_t write_offset = offset; |
| 39 const char* buf = data.c_str(); | 39 const char* buf = data.c_str(); |
| 40 int32_t size = data.size(); | 40 int32_t size = data.size(); |
| 41 | 41 |
| 42 while (write_offset < offset + size) { | 42 while (write_offset < offset + size) { |
| 43 int32_t rv = file_io->Write(write_offset, &buf[write_offset - offset], | 43 callback.WaitForResult(file_io->Write(write_offset, |
| 44 size - write_offset + offset, callback); | 44 &buf[write_offset - offset], |
| 45 if (rv == PP_OK_COMPLETIONPENDING) | 45 size - write_offset + offset, |
| 46 rv = callback.WaitForResult(); | 46 callback)); |
| 47 if (rv < 0) | 47 if (callback.result() < 0) |
| 48 return rv; | 48 return callback.result(); |
| 49 if (rv == 0) | 49 if (callback.result() == 0) |
| 50 return PP_ERROR_FAILED; | 50 return PP_ERROR_FAILED; |
| 51 write_offset += rv; | 51 write_offset += callback.result(); |
| 52 } | 52 } |
| 53 | 53 |
| 54 return PP_OK; | 54 return PP_OK; |
| 55 } | 55 } |
| 56 | 56 |
| 57 } // namespace | 57 } // namespace |
| 58 | 58 |
| 59 TestURLLoader::TestURLLoader(TestingInstance* instance) | 59 TestURLLoader::TestURLLoader(TestingInstance* instance) |
| 60 : TestCase(instance), | 60 : TestCase(instance), |
| 61 file_io_trusted_interface_(NULL), | 61 file_io_trusted_interface_(NULL), |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 RUN_TEST_FORCEASYNC_AND_NOT(TrustedHttpRequests, filter); | 115 RUN_TEST_FORCEASYNC_AND_NOT(TrustedHttpRequests, filter); |
| 116 RUN_TEST_FORCEASYNC_AND_NOT(FollowURLRedirect, filter); | 116 RUN_TEST_FORCEASYNC_AND_NOT(FollowURLRedirect, filter); |
| 117 RUN_TEST_FORCEASYNC_AND_NOT(AuditURLRedirect, filter); | 117 RUN_TEST_FORCEASYNC_AND_NOT(AuditURLRedirect, filter); |
| 118 RUN_TEST_FORCEASYNC_AND_NOT(AbortCalls, filter); | 118 RUN_TEST_FORCEASYNC_AND_NOT(AbortCalls, filter); |
| 119 RUN_TEST_FORCEASYNC_AND_NOT(UntendedLoad, filter); | 119 RUN_TEST_FORCEASYNC_AND_NOT(UntendedLoad, filter); |
| 120 RUN_TEST_FORCEASYNC_AND_NOT(PrefetchBufferThreshold, filter); | 120 RUN_TEST_FORCEASYNC_AND_NOT(PrefetchBufferThreshold, filter); |
| 121 } | 121 } |
| 122 | 122 |
| 123 std::string TestURLLoader::ReadEntireFile(pp::FileIO* file_io, | 123 std::string TestURLLoader::ReadEntireFile(pp::FileIO* file_io, |
| 124 std::string* data) { | 124 std::string* data) { |
| 125 TestCompletionCallback callback(instance_->pp_instance(), force_async_); | 125 TestCompletionCallback callback(instance_->pp_instance(), callback_type()); |
| 126 char buf[256]; | 126 char buf[256]; |
| 127 int64_t offset = 0; | 127 int64_t offset = 0; |
| 128 | 128 |
| 129 for (;;) { | 129 for (;;) { |
| 130 int32_t rv = file_io->Read(offset, buf, sizeof(buf), callback); | 130 callback.WaitForResult(file_io->Read(offset, buf, sizeof(buf), callback)); |
| 131 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | 131 if (callback.result() < 0) |
| 132 return ReportError("FileIO::Read force_async", rv); | 132 return ReportError("FileIO::Read", callback.result()); |
| 133 if (rv == PP_OK_COMPLETIONPENDING) | 133 if (callback.result() == 0) |
| 134 rv = callback.WaitForResult(); | |
| 135 if (rv < 0) | |
| 136 return ReportError("FileIO::Read", rv); | |
| 137 if (rv == 0) | |
| 138 break; | 134 break; |
| 139 offset += rv; | 135 offset += callback.result(); |
| 140 data->append(buf, rv); | 136 data->append(buf, callback.result()); |
| 141 } | 137 } |
| 142 | 138 |
| 143 PASS(); | 139 PASS(); |
| 144 } | 140 } |
| 145 | 141 |
| 146 std::string TestURLLoader::ReadEntireResponseBody(pp::URLLoader* loader, | 142 std::string TestURLLoader::ReadEntireResponseBody(pp::URLLoader* loader, |
| 147 std::string* body) { | 143 std::string* body) { |
| 148 TestCompletionCallback callback(instance_->pp_instance(), force_async_); | 144 TestCompletionCallback callback(instance_->pp_instance(), callback_type()); |
| 149 char buf[2]; // Small so that multiple reads are needed. | 145 char buf[2]; // Small so that multiple reads are needed. |
| 150 | 146 |
| 151 for (;;) { | 147 for (;;) { |
| 152 int32_t rv = loader->ReadResponseBody(buf, sizeof(buf), callback); | 148 callback.WaitForResult( |
| 153 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | 149 loader->ReadResponseBody(buf, sizeof(buf), callback)); |
| 154 return ReportError("URLLoader::ReadResponseBody force_async", rv); | 150 if (callback.result() < 0) |
| 155 if (rv == PP_OK_COMPLETIONPENDING) | 151 return ReportError("URLLoader::ReadResponseBody", callback.result()); |
| 156 rv = callback.WaitForResult(); | 152 if (callback.result() == 0) |
| 157 if (rv < 0) | |
| 158 return ReportError("URLLoader::ReadResponseBody", rv); | |
| 159 if (rv == 0) | |
| 160 break; | 153 break; |
| 161 body->append(buf, rv); | 154 body->append(buf, callback.result()); |
| 162 } | 155 } |
| 163 | 156 |
| 164 PASS(); | 157 PASS(); |
| 165 } | 158 } |
| 166 | 159 |
| 167 std::string TestURLLoader::LoadAndCompareBody( | 160 std::string TestURLLoader::LoadAndCompareBody( |
| 168 const pp::URLRequestInfo& request, | 161 const pp::URLRequestInfo& request, |
| 169 const std::string& expected_body) { | 162 const std::string& expected_body) { |
| 170 TestCompletionCallback callback(instance_->pp_instance(), force_async_); | 163 TestCompletionCallback callback(instance_->pp_instance(), callback_type()); |
| 171 | 164 |
| 172 pp::URLLoader loader(instance_); | 165 pp::URLLoader loader(instance_); |
| 173 int32_t rv = loader.Open(request, callback); | 166 callback.WaitForResult(loader.Open(request, callback)); |
| 174 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | 167 CHECK_CALLBACK_BEHAVIOR(callback); |
| 175 return ReportError("URLLoader::Open force_async", rv); | 168 ASSERT_EQ(PP_OK, callback.result()); |
| 176 if (rv == PP_OK_COMPLETIONPENDING) | |
| 177 rv = callback.WaitForResult(); | |
| 178 if (rv != PP_OK) | |
| 179 return ReportError("URLLoader::Open", rv); | |
| 180 | 169 |
| 181 pp::URLResponseInfo response_info(loader.GetResponseInfo()); | 170 pp::URLResponseInfo response_info(loader.GetResponseInfo()); |
| 182 if (response_info.is_null()) | 171 if (response_info.is_null()) |
| 183 return "URLLoader::GetResponseInfo returned null"; | 172 return "URLLoader::GetResponseInfo returned null"; |
| 184 int32_t status_code = response_info.GetStatusCode(); | 173 int32_t status_code = response_info.GetStatusCode(); |
| 185 if (status_code != 200) | 174 if (status_code != 200) |
| 186 return "Unexpected HTTP status code"; | 175 return "Unexpected HTTP status code"; |
| 187 | 176 |
| 188 std::string body; | 177 std::string body; |
| 189 std::string error = ReadEntireResponseBody(&loader, &body); | 178 std::string error = ReadEntireResponseBody(&loader, &body); |
| 190 if (!error.empty()) | 179 if (!error.empty()) |
| 191 return error; | 180 return error; |
| 192 | 181 |
| 193 if (body.size() != expected_body.size()) | 182 if (body.size() != expected_body.size()) |
| 194 return "URLLoader::ReadResponseBody returned unexpected content length"; | 183 return "URLLoader::ReadResponseBody returned unexpected content length"; |
| 195 if (body != expected_body) | 184 if (body != expected_body) |
| 196 return "URLLoader::ReadResponseBody returned unexpected content"; | 185 return "URLLoader::ReadResponseBody returned unexpected content"; |
| 197 | 186 |
| 198 PASS(); | 187 PASS(); |
| 199 } | 188 } |
| 200 | 189 |
| 201 int32_t TestURLLoader::OpenFileSystem(pp::FileSystem* file_system, | 190 int32_t TestURLLoader::OpenFileSystem(pp::FileSystem* file_system, |
| 202 std::string* message) { | 191 std::string* message) { |
| 203 TestCompletionCallback callback(instance_->pp_instance(), force_async_); | 192 TestCompletionCallback callback(instance_->pp_instance(), callback_type()); |
| 204 int32_t rv = file_system->Open(1024, callback); | 193 callback.WaitForResult(file_system->Open(1024, callback)); |
| 205 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) { | 194 if (callback.failed()) { |
| 206 message->assign("FileSystem::Open force_async"); | 195 message->assign(callback.errors()); |
| 207 return rv; | 196 return callback.result(); |
| 208 } | 197 } |
| 209 if (rv == PP_OK_COMPLETIONPENDING) | 198 if (callback.result() != PP_OK) { |
| 210 rv = callback.WaitForResult(); | |
| 211 if (rv != PP_OK) { | |
| 212 message->assign("FileSystem::Open"); | 199 message->assign("FileSystem::Open"); |
| 213 return rv; | 200 return callback.result(); |
| 214 } | 201 } |
| 215 return rv; | 202 return callback.result(); |
| 216 } | 203 } |
| 217 | 204 |
| 218 int32_t TestURLLoader::PrepareFileForPost( | 205 int32_t TestURLLoader::PrepareFileForPost( |
| 219 const pp::FileRef& file_ref, | 206 const pp::FileRef& file_ref, |
| 220 const std::string& data, | 207 const std::string& data, |
| 221 std::string* message) { | 208 std::string* message) { |
| 222 TestCompletionCallback callback(instance_->pp_instance(), force_async_); | 209 TestCompletionCallback callback(instance_->pp_instance(), callback_type()); |
| 223 pp::FileIO file_io(instance_); | 210 pp::FileIO file_io(instance_); |
| 224 int32_t rv = file_io.Open(file_ref, | 211 callback.WaitForResult(file_io.Open(file_ref, |
| 225 PP_FILEOPENFLAG_CREATE | | 212 PP_FILEOPENFLAG_CREATE | |
| 226 PP_FILEOPENFLAG_TRUNCATE | | 213 PP_FILEOPENFLAG_TRUNCATE | |
| 227 PP_FILEOPENFLAG_WRITE, | 214 PP_FILEOPENFLAG_WRITE, |
| 228 callback); | 215 callback)); |
| 229 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) { | 216 if (callback.failed()) { |
| 230 message->assign("FileIO::Open force_async"); | 217 message->assign(callback.errors()); |
| 231 return rv; | 218 return callback.result(); |
| 232 } | 219 } |
| 233 if (rv == PP_OK_COMPLETIONPENDING) | 220 if (callback.result() != PP_OK) { |
| 234 rv = callback.WaitForResult(); | 221 message->assign("FileIO::Open failed."); |
| 222 return callback.result(); |
| 223 } |
| 224 |
| 225 int32_t rv = WriteEntireBuffer(instance_->pp_instance(), &file_io, 0, data); |
| 235 if (rv != PP_OK) { | 226 if (rv != PP_OK) { |
| 236 message->assign("FileIO::Open"); | 227 message->assign("FileIO::Write failed."); |
| 237 return rv; | 228 return rv; |
| 238 } | 229 } |
| 239 | 230 |
| 240 rv = WriteEntireBuffer(instance_->pp_instance(), &file_io, 0, data); | |
| 241 if (rv != PP_OK) { | |
| 242 message->assign("FileIO::Write"); | |
| 243 return rv; | |
| 244 } | |
| 245 | |
| 246 return rv; | 231 return rv; |
| 247 } | 232 } |
| 248 | 233 |
| 249 std::string TestURLLoader::GetReachableAbsoluteURL( | 234 std::string TestURLLoader::GetReachableAbsoluteURL( |
| 250 const std::string& file_name) { | 235 const std::string& file_name) { |
| 251 // Get the absolute page URL and replace the test case file name | 236 // Get the absolute page URL and replace the test case file name |
| 252 // with the given one. | 237 // with the given one. |
| 253 pp::Var document_url( | 238 pp::Var document_url( |
| 254 pp::PASS_REF, | 239 pp::PASS_REF, |
| 255 testing_interface_->GetDocumentURL(instance_->pp_instance(), | 240 testing_interface_->GetDocumentURL(instance_->pp_instance(), |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 | 287 |
| 303 int32_t TestURLLoader::OpenTrusted(const pp::URLRequestInfo& request) { | 288 int32_t TestURLLoader::OpenTrusted(const pp::URLRequestInfo& request) { |
| 304 return Open(request, true); | 289 return Open(request, true); |
| 305 } | 290 } |
| 306 | 291 |
| 307 int32_t TestURLLoader::Open(const pp::URLRequestInfo& request, | 292 int32_t TestURLLoader::Open(const pp::URLRequestInfo& request, |
| 308 bool trusted) { | 293 bool trusted) { |
| 309 pp::URLLoader loader(instance_); | 294 pp::URLLoader loader(instance_); |
| 310 if (trusted) | 295 if (trusted) |
| 311 url_loader_trusted_interface_->GrantUniversalAccess(loader.pp_resource()); | 296 url_loader_trusted_interface_->GrantUniversalAccess(loader.pp_resource()); |
| 312 TestCompletionCallback callback(instance_->pp_instance(), force_async_); | 297 TestCompletionCallback callback(instance_->pp_instance(), callback_type()); |
| 313 int32_t rv = loader.Open(request, callback); | 298 callback.WaitForResult(loader.Open(request, callback)); |
| 314 | 299 return callback.result(); |
| 315 if (rv == PP_OK_COMPLETIONPENDING) | |
| 316 rv = callback.WaitForResult(); | |
| 317 else if (force_async_) | |
| 318 ReportError("URLLoader::Open force_async", rv); | |
| 319 | |
| 320 return rv; | |
| 321 } | 300 } |
| 322 | 301 |
| 323 std::string TestURLLoader::TestBasicGET() { | 302 std::string TestURLLoader::TestBasicGET() { |
| 324 pp::URLRequestInfo request(instance_); | 303 pp::URLRequestInfo request(instance_); |
| 325 request.SetURL("test_url_loader_data/hello.txt"); | 304 request.SetURL("test_url_loader_data/hello.txt"); |
| 326 return LoadAndCompareBody(request, "hello\n"); | 305 return LoadAndCompareBody(request, "hello\n"); |
| 327 } | 306 } |
| 328 | 307 |
| 329 std::string TestURLLoader::TestBasicPOST() { | 308 std::string TestURLLoader::TestBasicPOST() { |
| 330 pp::URLRequestInfo request(instance_); | 309 pp::URLRequestInfo request(instance_); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 "Untrusted request with bogus Content-Length restriction", rv); | 409 "Untrusted request with bogus Content-Length restriction", rv); |
| 431 | 410 |
| 432 PASS(); | 411 PASS(); |
| 433 } | 412 } |
| 434 | 413 |
| 435 std::string TestURLLoader::TestStreamToFile() { | 414 std::string TestURLLoader::TestStreamToFile() { |
| 436 pp::URLRequestInfo request(instance_); | 415 pp::URLRequestInfo request(instance_); |
| 437 request.SetURL("test_url_loader_data/hello.txt"); | 416 request.SetURL("test_url_loader_data/hello.txt"); |
| 438 request.SetStreamToFile(true); | 417 request.SetStreamToFile(true); |
| 439 | 418 |
| 440 TestCompletionCallback callback(instance_->pp_instance(), force_async_); | 419 TestCompletionCallback callback(instance_->pp_instance(), callback_type()); |
| 441 | 420 |
| 442 pp::URLLoader loader(instance_); | 421 pp::URLLoader loader(instance_); |
| 443 int32_t rv = loader.Open(request, callback); | 422 callback.WaitForResult(loader.Open(request, callback)); |
| 444 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | 423 CHECK_CALLBACK_BEHAVIOR(callback); |
| 445 return ReportError("URLLoader::Open force_async", rv); | 424 ASSERT_EQ(PP_OK, callback.result()); |
| 446 if (rv == PP_OK_COMPLETIONPENDING) | |
| 447 rv = callback.WaitForResult(); | |
| 448 if (rv != PP_OK) | |
| 449 return ReportError("URLLoader::Open", rv); | |
| 450 | 425 |
| 451 pp::URLResponseInfo response_info(loader.GetResponseInfo()); | 426 pp::URLResponseInfo response_info(loader.GetResponseInfo()); |
| 452 if (response_info.is_null()) | 427 if (response_info.is_null()) |
| 453 return "URLLoader::GetResponseInfo returned null"; | 428 return "URLLoader::GetResponseInfo returned null"; |
| 454 int32_t status_code = response_info.GetStatusCode(); | 429 int32_t status_code = response_info.GetStatusCode(); |
| 455 if (status_code != 200) | 430 if (status_code != 200) |
| 456 return "Unexpected HTTP status code"; | 431 return "Unexpected HTTP status code"; |
| 457 | 432 |
| 458 pp::FileRef body(response_info.GetBodyAsFileRef()); | 433 pp::FileRef body(response_info.GetBodyAsFileRef()); |
| 459 if (body.is_null()) | 434 if (body.is_null()) |
| 460 return "URLResponseInfo::GetBody returned null"; | 435 return "URLResponseInfo::GetBody returned null"; |
| 461 | 436 |
| 462 rv = loader.FinishStreamingToFile(callback); | 437 callback.WaitForResult(loader.FinishStreamingToFile(callback)); |
| 463 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | 438 CHECK_CALLBACK_BEHAVIOR(callback); |
| 464 return ReportError("URLLoader::FinishStreamingToFile force_async", rv); | 439 ASSERT_EQ(PP_OK, callback.result()); |
| 465 if (rv == PP_OK_COMPLETIONPENDING) | |
| 466 rv = callback.WaitForResult(); | |
| 467 if (rv != PP_OK) | |
| 468 return ReportError("URLLoader::FinishStreamingToFile", rv); | |
| 469 | 440 |
| 470 // FileIO is not yet supported by ppapi/proxy. | |
| 471 pp::FileIO reader(instance_); | 441 pp::FileIO reader(instance_); |
| 472 rv = reader.Open(body, PP_FILEOPENFLAG_READ, callback); | 442 callback.WaitForResult(reader.Open(body, PP_FILEOPENFLAG_READ, callback)); |
| 473 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | 443 CHECK_CALLBACK_BEHAVIOR(callback); |
| 474 return ReportError("FileIO::Open force_async", rv); | 444 ASSERT_EQ(PP_OK, callback.result()); |
| 475 if (rv == PP_OK_COMPLETIONPENDING) | |
| 476 rv = callback.WaitForResult(); | |
| 477 if (rv != PP_OK) | |
| 478 return ReportError("FileIO::Open", rv); | |
| 479 | 445 |
| 480 std::string data; | 446 std::string data; |
| 481 std::string error = ReadEntireFile(&reader, &data); | 447 std::string error = ReadEntireFile(&reader, &data); |
| 482 if (!error.empty()) | 448 if (!error.empty()) |
| 483 return error; | 449 return error; |
| 484 | 450 |
| 485 std::string expected_body = "hello\n"; | 451 std::string expected_body = "hello\n"; |
| 486 if (data.size() != expected_body.size()) | 452 if (data.size() != expected_body.size()) |
| 487 return "ReadEntireFile returned unexpected content length"; | 453 return "ReadEntireFile returned unexpected content length"; |
| 488 if (data != expected_body) | 454 if (data != expected_body) |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 719 pp::URLRequestInfo request(instance_); | 685 pp::URLRequestInfo request(instance_); |
| 720 // This path will cause the server to return a 301 redirect. | 686 // This path will cause the server to return a 301 redirect. |
| 721 // This prefix causes the test server to return a 301 redirect. | 687 // This prefix causes the test server to return a 301 redirect. |
| 722 std::string redirect_prefix("/server-redirect?"); | 688 std::string redirect_prefix("/server-redirect?"); |
| 723 // We need an absolute path for the redirect to actually work. | 689 // We need an absolute path for the redirect to actually work. |
| 724 std::string redirect_url = | 690 std::string redirect_url = |
| 725 GetReachableAbsoluteURL("test_url_loader_data/hello.txt"); | 691 GetReachableAbsoluteURL("test_url_loader_data/hello.txt"); |
| 726 request.SetURL(redirect_prefix.append(redirect_url)); | 692 request.SetURL(redirect_prefix.append(redirect_url)); |
| 727 request.SetFollowRedirects(false); | 693 request.SetFollowRedirects(false); |
| 728 | 694 |
| 729 TestCompletionCallback callback(instance_->pp_instance(), force_async_); | 695 TestCompletionCallback callback(instance_->pp_instance(), callback_type()); |
| 730 | 696 |
| 731 pp::URLLoader loader(instance_); | 697 pp::URLLoader loader(instance_); |
| 732 int32_t rv = loader.Open(request, callback); | 698 callback.WaitForResult(loader.Open(request, callback)); |
| 733 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | 699 CHECK_CALLBACK_BEHAVIOR(callback); |
| 734 return ReportError("URLLoader::Open force_async", rv); | 700 ASSERT_EQ(PP_OK, callback.result()); |
| 735 if (rv == PP_OK_COMPLETIONPENDING) | |
| 736 rv = callback.WaitForResult(); | |
| 737 if (rv != PP_OK) | |
| 738 return ReportError("URLLoader::Open", rv); | |
| 739 | 701 |
| 740 // Checks that the response indicates a redirect, and that the URL | 702 // Checks that the response indicates a redirect, and that the URL |
| 741 // is correct. | 703 // is correct. |
| 742 pp::URLResponseInfo response_info(loader.GetResponseInfo()); | 704 pp::URLResponseInfo response_info(loader.GetResponseInfo()); |
| 743 if (response_info.is_null()) | 705 if (response_info.is_null()) |
| 744 return "URLLoader::GetResponseInfo returned null"; | 706 return "URLLoader::GetResponseInfo returned null"; |
| 745 int32_t status_code = response_info.GetStatusCode(); | 707 int32_t status_code = response_info.GetStatusCode(); |
| 746 if (status_code != 301) | 708 if (status_code != 301) |
| 747 return "Response status should be 301"; | 709 return "Response status should be 301"; |
| 748 | 710 |
| 749 // Test that the paused loader can be resumed. | 711 // Test that the paused loader can be resumed. |
| 750 TestCompletionCallback redirect_callback(instance_->pp_instance(), | 712 callback.WaitForResult(loader.FollowRedirect(callback)); |
| 751 force_async_); | 713 CHECK_CALLBACK_BEHAVIOR(callback); |
| 752 rv = loader.FollowRedirect(redirect_callback); | 714 ASSERT_EQ(PP_OK, callback.result()); |
| 753 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | |
| 754 return ReportError("URLLoader::FollowRedirect force_async", rv); | |
| 755 if (rv == PP_OK_COMPLETIONPENDING) | |
| 756 rv = redirect_callback.WaitForResult(); | |
| 757 if (rv != PP_OK) | |
| 758 return ReportError("URLLoader::FollowRedirect", rv); | |
| 759 std::string body; | 715 std::string body; |
| 760 std::string error = ReadEntireResponseBody(&loader, &body); | 716 std::string error = ReadEntireResponseBody(&loader, &body); |
| 761 if (!error.empty()) | 717 if (!error.empty()) |
| 762 return error; | 718 return error; |
| 763 | 719 |
| 764 if (body != "hello\n") | 720 if (body != "hello\n") |
| 765 return "URLLoader::FollowRedirect failed"; | 721 return "URLLoader::FollowRedirect failed"; |
| 766 | 722 |
| 767 PASS(); | 723 PASS(); |
| 768 } | 724 } |
| 769 | 725 |
| 770 std::string TestURLLoader::TestAbortCalls() { | 726 std::string TestURLLoader::TestAbortCalls() { |
| 771 pp::URLRequestInfo request(instance_); | 727 pp::URLRequestInfo request(instance_); |
| 772 request.SetURL("test_url_loader_data/hello.txt"); | 728 request.SetURL("test_url_loader_data/hello.txt"); |
| 773 | 729 |
| 774 TestCompletionCallback callback(instance_->pp_instance(), force_async_); | 730 TestCompletionCallback callback(instance_->pp_instance(), callback_type()); |
| 775 int32_t rv; | 731 int32_t rv; |
| 776 | 732 |
| 777 // Abort |Open()|. | 733 // Abort |Open()|. |
| 778 { | 734 { |
| 779 callback.reset_run_count(); | |
| 780 rv = pp::URLLoader(instance_).Open(request, callback); | 735 rv = pp::URLLoader(instance_).Open(request, callback); |
| 781 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | |
| 782 return ReportError("URLLoader::Open force_async", rv); | |
| 783 if (callback.run_count() > 0) | |
| 784 return "URLLoader::Open ran callback synchronously."; | |
| 785 if (rv == PP_OK_COMPLETIONPENDING) { | |
| 786 rv = callback.WaitForResult(); | |
| 787 if (rv != PP_ERROR_ABORTED) | |
| 788 return "URLLoader::Open not aborted."; | |
| 789 } else if (rv != PP_OK) { | |
| 790 return ReportError("URLLoader::Open", rv); | |
| 791 } | |
| 792 } | 736 } |
| 737 callback.WaitForAbortResult(rv); |
| 738 CHECK_CALLBACK_BEHAVIOR(callback); |
| 793 | 739 |
| 794 // Abort |ReadResponseBody()|. | 740 // Abort |ReadResponseBody()|. |
| 795 { | 741 { |
| 796 char buf[2] = { 0 }; | 742 char buf[2] = { 0 }; |
| 797 { | 743 { |
| 798 pp::URLLoader loader(instance_); | 744 pp::URLLoader loader(instance_); |
| 799 rv = loader.Open(request, callback); | 745 callback.WaitForResult(loader.Open(request, callback)); |
| 800 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | 746 CHECK_CALLBACK_BEHAVIOR(callback); |
| 801 return ReportError("URLLoader::Open force_async", rv); | 747 ASSERT_EQ(PP_OK, callback.result()); |
| 802 if (rv == PP_OK_COMPLETIONPENDING) | |
| 803 rv = callback.WaitForResult(); | |
| 804 if (rv != PP_OK) | |
| 805 return ReportError("URLLoader::Open", rv); | |
| 806 | 748 |
| 807 callback.reset_run_count(); | |
| 808 rv = loader.ReadResponseBody(buf, sizeof(buf), callback); | 749 rv = loader.ReadResponseBody(buf, sizeof(buf), callback); |
| 809 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | |
| 810 return ReportError("URLLoader::ReadResponseBody force_async", rv); | |
| 811 } // Destroy |loader|. | 750 } // Destroy |loader|. |
| 751 callback.WaitForAbortResult(rv); |
| 752 CHECK_CALLBACK_BEHAVIOR(callback); |
| 812 if (rv == PP_OK_COMPLETIONPENDING) { | 753 if (rv == PP_OK_COMPLETIONPENDING) { |
| 813 // Save a copy and make sure |buf| doesn't get written to. | 754 if (buf[0] || buf[1]) { |
| 814 char buf_copy[2]; | |
| 815 memcpy(&buf_copy, &buf, sizeof(buf)); | |
| 816 rv = callback.WaitForResult(); | |
| 817 if (rv != PP_ERROR_ABORTED) | |
| 818 return "URLLoader::ReadResponseBody not aborted."; | |
| 819 if (memcmp(&buf_copy, &buf, sizeof(buf)) != 0) | |
| 820 return "URLLoader::ReadResponseBody wrote data after resource " | 755 return "URLLoader::ReadResponseBody wrote data after resource " |
| 821 "destruction."; | 756 "destruction."; |
| 822 } else if (rv != PP_OK) { | 757 } |
| 823 return ReportError("URLLoader::ReadResponseBody", rv); | |
| 824 } | 758 } |
| 825 } | 759 } |
| 826 | 760 |
| 827 // TODO(viettrungluu): More abort tests (but add basic tests first). | 761 // TODO(viettrungluu): More abort tests (but add basic tests first). |
| 828 // Also test that Close() aborts properly. crbug.com/69457 | 762 // Also test that Close() aborts properly. crbug.com/69457 |
| 829 | 763 |
| 830 PASS(); | 764 PASS(); |
| 831 } | 765 } |
| 832 | 766 |
| 833 std::string TestURLLoader::TestUntendedLoad() { | 767 std::string TestURLLoader::TestUntendedLoad() { |
| 834 pp::URLRequestInfo request(instance_); | 768 pp::URLRequestInfo request(instance_); |
| 835 request.SetURL("test_url_loader_data/hello.txt"); | 769 request.SetURL("test_url_loader_data/hello.txt"); |
| 836 request.SetRecordDownloadProgress(true); | 770 request.SetRecordDownloadProgress(true); |
| 837 TestCompletionCallback callback(instance_->pp_instance(), force_async_); | 771 TestCompletionCallback callback(instance_->pp_instance(), callback_type()); |
| 838 | 772 |
| 839 pp::URLLoader loader(instance_); | 773 pp::URLLoader loader(instance_); |
| 840 int32_t rv = loader.Open(request, callback); | 774 callback.WaitForResult(loader.Open(request, callback)); |
| 841 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | 775 CHECK_CALLBACK_BEHAVIOR(callback); |
| 842 return ReportError("URLLoader::Open force_async", rv); | 776 ASSERT_EQ(PP_OK, callback.result()); |
| 843 if (rv == PP_OK_COMPLETIONPENDING) | |
| 844 rv = callback.WaitForResult(); | |
| 845 if (rv != PP_OK) | |
| 846 return ReportError("URLLoader::Open", rv); | |
| 847 | 777 |
| 848 // We received the response callback. Yield until the network code has called | 778 // We received the response callback. Yield until the network code has called |
| 849 // the loader's didReceiveData and didFinishLoading methods before we give it | 779 // the loader's didReceiveData and didFinishLoading methods before we give it |
| 850 // another callback function, to make sure the loader works with no callback. | 780 // another callback function, to make sure the loader works with no callback. |
| 851 int64_t bytes_received = 0; | 781 int64_t bytes_received = 0; |
| 852 int64_t total_bytes_to_be_received = 0; | 782 int64_t total_bytes_to_be_received = 0; |
| 853 while (true) { | 783 while (true) { |
| 854 loader.GetDownloadProgress(&bytes_received, &total_bytes_to_be_received); | 784 loader.GetDownloadProgress(&bytes_received, &total_bytes_to_be_received); |
| 855 if (total_bytes_to_be_received <= 0) | 785 if (total_bytes_to_be_received <= 0) |
| 856 return ReportError("URLLoader::GetDownloadProgress total size", | 786 return ReportError("URLLoader::GetDownloadProgress total size", |
| 857 total_bytes_to_be_received); | 787 total_bytes_to_be_received); |
| 858 if (bytes_received == total_bytes_to_be_received) | 788 if (bytes_received == total_bytes_to_be_received) |
| 859 break; | 789 break; |
| 860 pp::Module::Get()->core()->CallOnMainThread(10, callback); | 790 pp::Module::Get()->core()->CallOnMainThread(10, callback); |
| 861 callback.WaitForResult(); | 791 callback.WaitForResult(); |
| 862 } | 792 } |
| 863 | 793 |
| 864 // The loader should now have the data and have finished successfully. | 794 // The loader should now have the data and have finished successfully. |
| 865 std::string body; | 795 std::string body; |
| 866 std::string error = ReadEntireResponseBody(&loader, &body); | 796 std::string error = ReadEntireResponseBody(&loader, &body); |
| 867 if (!error.empty()) | 797 if (!error.empty()) |
| 868 return error; | 798 return error; |
| 869 if (body != "hello\n") | 799 if (body != "hello\n") |
| 870 return ReportError("Couldn't read data", rv); | 800 return ReportError("Couldn't read data", callback.result()); |
| 871 | 801 |
| 872 PASS(); | 802 PASS(); |
| 873 } | 803 } |
| 874 | 804 |
| 875 int32_t TestURLLoader::OpenWithPrefetchBufferThreshold(int32_t lower, | 805 int32_t TestURLLoader::OpenWithPrefetchBufferThreshold(int32_t lower, |
| 876 int32_t upper) { | 806 int32_t upper) { |
| 877 pp::URLRequestInfo request(instance_); | 807 pp::URLRequestInfo request(instance_); |
| 878 request.SetURL("test_url_loader_data/hello.txt"); | 808 request.SetURL("test_url_loader_data/hello.txt"); |
| 879 request.SetPrefetchBufferLowerThreshold(lower); | 809 request.SetPrefetchBufferLowerThreshold(lower); |
| 880 request.SetPrefetchBufferUpperThreshold(upper); | 810 request.SetPrefetchBufferUpperThreshold(upper); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 899 if (rv != PP_ERROR_FAILED) { | 829 if (rv != PP_ERROR_FAILED) { |
| 900 return ReportError("The lower buffer value was higher than the upper but " | 830 return ReportError("The lower buffer value was higher than the upper but " |
| 901 "the URLLoader did not fail.", rv); | 831 "the URLLoader did not fail.", rv); |
| 902 } | 832 } |
| 903 | 833 |
| 904 PASS(); | 834 PASS(); |
| 905 } | 835 } |
| 906 | 836 |
| 907 // TODO(viettrungluu): Add tests for Get{Upload,Download}Progress, Close | 837 // TODO(viettrungluu): Add tests for Get{Upload,Download}Progress, Close |
| 908 // (including abort tests if applicable). | 838 // (including abort tests if applicable). |
| OLD | NEW |