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

Side by Side Diff: ppapi/tests/test_url_loader.cc

Issue 8886001: Add URLLoader tests for FollowRedirect. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years 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 | Annotate | Revision Log
« no previous file with comments | « ppapi/tests/test_url_loader.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_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
11 #include "ppapi/c/dev/ppb_testing_dev.h" 11 #include "ppapi/c/dev/ppb_testing_dev.h"
12 #include "ppapi/c/dev/ppb_url_util_dev.h"
13 #include "ppapi/c/pp_errors.h" 12 #include "ppapi/c/pp_errors.h"
14 #include "ppapi/c/ppb_file_io.h" 13 #include "ppapi/c/ppb_file_io.h"
15 #include "ppapi/c/ppb_url_loader.h" 14 #include "ppapi/c/ppb_url_loader.h"
16 #include "ppapi/c/trusted/ppb_file_io_trusted.h" 15 #include "ppapi/c/trusted/ppb_file_io_trusted.h"
17 #include "ppapi/c/trusted/ppb_url_loader_trusted.h" 16 #include "ppapi/c/trusted/ppb_url_loader_trusted.h"
18 #include "ppapi/cpp/dev/url_util_dev.h" 17 #include "ppapi/cpp/dev/url_util_dev.h"
19 #include "ppapi/cpp/file_io.h" 18 #include "ppapi/cpp/file_io.h"
20 #include "ppapi/cpp/file_ref.h" 19 #include "ppapi/cpp/file_ref.h"
21 #include "ppapi/cpp/file_system.h" 20 #include "ppapi/cpp/file_system.h"
22 #include "ppapi/cpp/instance.h" 21 #include "ppapi/cpp/instance.h"
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 RUN_TEST_FORCEASYNC_AND_NOT(FailsBogusContentLength, filter); 114 RUN_TEST_FORCEASYNC_AND_NOT(FailsBogusContentLength, filter);
116 RUN_TEST_FORCEASYNC_AND_NOT(StreamToFile, filter); 115 RUN_TEST_FORCEASYNC_AND_NOT(StreamToFile, filter);
117 RUN_TEST_FORCEASYNC_AND_NOT(UntrustedSameOriginRestriction, filter); 116 RUN_TEST_FORCEASYNC_AND_NOT(UntrustedSameOriginRestriction, filter);
118 RUN_TEST_FORCEASYNC_AND_NOT(TrustedSameOriginRestriction, filter); 117 RUN_TEST_FORCEASYNC_AND_NOT(TrustedSameOriginRestriction, filter);
119 RUN_TEST_FORCEASYNC_AND_NOT(UntrustedCrossOriginRequest, filter); 118 RUN_TEST_FORCEASYNC_AND_NOT(UntrustedCrossOriginRequest, filter);
120 RUN_TEST_FORCEASYNC_AND_NOT(TrustedCrossOriginRequest, filter); 119 RUN_TEST_FORCEASYNC_AND_NOT(TrustedCrossOriginRequest, filter);
121 RUN_TEST_FORCEASYNC_AND_NOT(UntrustedJavascriptURLRestriction, filter); 120 RUN_TEST_FORCEASYNC_AND_NOT(UntrustedJavascriptURLRestriction, filter);
122 RUN_TEST_FORCEASYNC_AND_NOT(TrustedJavascriptURLRestriction, filter); 121 RUN_TEST_FORCEASYNC_AND_NOT(TrustedJavascriptURLRestriction, filter);
123 RUN_TEST_FORCEASYNC_AND_NOT(UntrustedHttpRequests, filter); 122 RUN_TEST_FORCEASYNC_AND_NOT(UntrustedHttpRequests, filter);
124 RUN_TEST_FORCEASYNC_AND_NOT(TrustedHttpRequests, filter); 123 RUN_TEST_FORCEASYNC_AND_NOT(TrustedHttpRequests, filter);
124 RUN_TEST_FORCEASYNC_AND_NOT(FollowURLRedirect, filter);
125 RUN_TEST_FORCEASYNC_AND_NOT(AuditURLRedirect, filter); 125 RUN_TEST_FORCEASYNC_AND_NOT(AuditURLRedirect, filter);
126 RUN_TEST_FORCEASYNC_AND_NOT(AbortCalls, filter); 126 RUN_TEST_FORCEASYNC_AND_NOT(AbortCalls, filter);
127 RUN_TEST_FORCEASYNC_AND_NOT(UntendedLoad, filter); 127 RUN_TEST_FORCEASYNC_AND_NOT(UntendedLoad, filter);
128 } 128 }
129 129
130 std::string TestURLLoader::ReadEntireFile(pp::FileIO* file_io, 130 std::string TestURLLoader::ReadEntireFile(pp::FileIO* file_io,
131 std::string* data) { 131 std::string* data) {
132 TestCompletionCallback callback(instance_->pp_instance(), force_async_); 132 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
133 char buf[256]; 133 char buf[256];
134 int64_t offset = 0; 134 int64_t offset = 0;
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 246
247 rv = WriteEntireBuffer(instance_->pp_instance(), &file_io, 0, data); 247 rv = WriteEntireBuffer(instance_->pp_instance(), &file_io, 0, data);
248 if (rv != PP_OK) { 248 if (rv != PP_OK) {
249 message->assign("FileIO::Write"); 249 message->assign("FileIO::Write");
250 return rv; 250 return rv;
251 } 251 }
252 252
253 return rv; 253 return rv;
254 } 254 }
255 255
256 std::string TestURLLoader::GetReachableCrossOriginURL() { 256 std::string TestURLLoader::GetReachableAbsoluteURL(
257 // Get the document URL and use it to construct a URL that will be 257 const std::string& file_name) {
258 // considered cross-origin by the WebKit access control code, and yet be 258 // Request the test page and scrape the absolute URL that the server returns
259 // as part of the response. Using the test page allows us to test redirected
260 // and cross-origin requests since we have a mock headers file.
261 pp::URLRequestInfo request(instance_);
262 request.SetURL(file_name);
263 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
264
265 pp::URLLoader loader(*instance_);
266 int32_t rv = loader.Open(request, callback);
267 if (rv == PP_OK_COMPLETIONPENDING)
268 rv = callback.WaitForResult();
269 ASSERT_EQ(rv, PP_OK);
270
271 pp::URLResponseInfo response_info(loader.GetResponseInfo());
272 ASSERT_FALSE(response_info.is_null());
273 ASSERT_EQ(response_info.GetStatusCode(), 200);
274 return response_info.GetURL().AsString();
275 }
276
277 std::string TestURLLoader::GetReachableCrossOriginURL(
278 const std::string& file_name) {
279 // Get an absolute URL and use it to construct a URL that will be
280 // considered cross-origin by the CORS access control code, and yet be
259 // reachable by the test server. 281 // reachable by the test server.
260 PP_URLComponents_Dev components; 282 std::string url = GetReachableAbsoluteURL(file_name);
261 pp::Var pp_document_url = pp::URLUtil_Dev::Get()->GetDocumentURL( 283 // Replace '127.0.0.1' with 'localhost'.
262 *instance_, &components); 284 std::string host("127.0.0.1");
263 std::string document_url = pp_document_url.AsString(); 285 size_t index = url.find(host);
264 // Replace "127.0.0.1" with "localhost". Or vice versa. 286 ASSERT_NE(index, std::string::npos);
265 bool changedHost = false; 287 url.replace(index, host.length(), "localhost");
266 if (document_url.find("127.0.0.1") != std::string::npos) { 288 return url;
267 document_url.replace(components.host.begin,
268 components.host.len,
269 "localhost");
270 changedHost = true;
271 } else if (document_url.find("localhost") != std::string::npos) {
272 document_url.replace(components.host.begin,
273 components.host.len,
274 "127.0.0.1");
275 changedHost = true;
276 }
277 ASSERT_TRUE(changedHost);
278 return document_url;
279 } 289 }
280 290
281 int32_t TestURLLoader::OpenUntrusted(const std::string& method, 291 int32_t TestURLLoader::OpenUntrusted(const std::string& method,
282 const std::string& header) { 292 const std::string& header) {
283 pp::URLRequestInfo request(instance_); 293 pp::URLRequestInfo request(instance_);
284 request.SetURL("/echo"); 294 request.SetURL("/echo");
285 request.SetMethod(method); 295 request.SetMethod(method);
286 request.SetHeaders(header); 296 request.SetHeaders(header);
287 297
288 return OpenUntrusted(request); 298 return OpenUntrusted(request);
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 return "FileIO::GetOSFileDescriptor() returned a bad file descriptor."; 510 return "FileIO::GetOSFileDescriptor() returned a bad file descriptor.";
501 #endif 511 #endif
502 } 512 }
503 } 513 }
504 PASS(); 514 PASS();
505 } 515 }
506 516
507 // Untrusted, unintended cross-origin requests should fail. 517 // Untrusted, unintended cross-origin requests should fail.
508 std::string TestURLLoader::TestUntrustedSameOriginRestriction() { 518 std::string TestURLLoader::TestUntrustedSameOriginRestriction() {
509 pp::URLRequestInfo request(instance_); 519 pp::URLRequestInfo request(instance_);
510 std::string cross_origin_url = GetReachableCrossOriginURL(); 520 std::string cross_origin_url = GetReachableCrossOriginURL("test_case.html");
511 request.SetURL(cross_origin_url); 521 request.SetURL(cross_origin_url);
512 522
513 int32_t rv = OpenUntrusted(request); 523 int32_t rv = OpenUntrusted(request);
514 if (rv != PP_ERROR_NOACCESS) 524 if (rv != PP_ERROR_NOACCESS)
515 return ReportError( 525 return ReportError(
516 "Untrusted, unintended cross-origin request restriction", rv); 526 "Untrusted, unintended cross-origin request restriction", rv);
517 527
518 PASS(); 528 PASS();
519 } 529 }
520 530
521 // Trusted, unintended cross-origin requests should succeed. 531 // Trusted, unintended cross-origin requests should succeed.
522 std::string TestURLLoader::TestTrustedSameOriginRestriction() { 532 std::string TestURLLoader::TestTrustedSameOriginRestriction() {
523 pp::URLRequestInfo request(instance_); 533 pp::URLRequestInfo request(instance_);
524 std::string cross_origin_url = GetReachableCrossOriginURL(); 534 std::string cross_origin_url = GetReachableCrossOriginURL("test_case.html");
525 request.SetURL(cross_origin_url); 535 request.SetURL(cross_origin_url);
526 536
527 int32_t rv = OpenTrusted(request); 537 int32_t rv = OpenTrusted(request);
528 if (rv != PP_OK) 538 if (rv != PP_OK)
529 return ReportError("Trusted cross-origin request failed", rv); 539 return ReportError("Trusted cross-origin request failed", rv);
530 540
531 PASS(); 541 PASS();
532 } 542 }
533 543
534 // Untrusted, intended cross-origin requests should use CORS and succeed. 544 // Untrusted, intended cross-origin requests should use CORS and succeed.
535 std::string TestURLLoader::TestUntrustedCrossOriginRequest() { 545 std::string TestURLLoader::TestUntrustedCrossOriginRequest() {
536 pp::URLRequestInfo request(instance_); 546 pp::URLRequestInfo request(instance_);
537 std::string cross_origin_url = GetReachableCrossOriginURL(); 547 std::string cross_origin_url = GetReachableCrossOriginURL("test_case.html");
538 request.SetURL(cross_origin_url); 548 request.SetURL(cross_origin_url);
539 request.SetAllowCrossOriginRequests(true); 549 request.SetAllowCrossOriginRequests(true);
540 550
541 int32_t rv = OpenUntrusted(request); 551 int32_t rv = OpenUntrusted(request);
542 if (rv != PP_OK) 552 if (rv != PP_OK)
543 return ReportError( 553 return ReportError(
544 "Untrusted, intended cross-origin request failed", rv); 554 "Untrusted, intended cross-origin request failed", rv);
545 555
546 PASS(); 556 PASS();
547 } 557 }
548 558
549 // Trusted, intended cross-origin requests should use CORS and succeed. 559 // Trusted, intended cross-origin requests should use CORS and succeed.
550 std::string TestURLLoader::TestTrustedCrossOriginRequest() { 560 std::string TestURLLoader::TestTrustedCrossOriginRequest() {
551 pp::URLRequestInfo request(instance_); 561 pp::URLRequestInfo request(instance_);
552 std::string cross_origin_url = GetReachableCrossOriginURL(); 562 std::string cross_origin_url = GetReachableCrossOriginURL("test_case.html");
553 request.SetURL(cross_origin_url); 563 request.SetURL(cross_origin_url);
554 request.SetAllowCrossOriginRequests(true); 564 request.SetAllowCrossOriginRequests(true);
555 565
556 int32_t rv = OpenTrusted(request); 566 int32_t rv = OpenTrusted(request);
557 if (rv != PP_OK) 567 if (rv != PP_OK)
558 return ReportError("Trusted cross-origin request failed", rv); 568 return ReportError("Trusted cross-origin request failed", rv);
559 569
560 PASS(); 570 PASS();
561 } 571 }
562 572
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 708
699 int32_t rv = OpenTrusted(request); 709 int32_t rv = OpenTrusted(request);
700 if (rv != PP_OK) 710 if (rv != PP_OK)
701 return ReportError( 711 return ReportError(
702 "Trusted request with content-transfer-encoding failed", rv); 712 "Trusted request with content-transfer-encoding failed", rv);
703 } 713 }
704 714
705 PASS(); 715 PASS();
706 } 716 }
707 717
718 // This test should cause a redirect and ensure that the loader follows it.
719 std::string TestURLLoader::TestFollowURLRedirect() {
720 pp::URLRequestInfo request(instance_);
721 // This prefix causes the test server to return a 301 redirect.
722 std::string redirect_prefix("/server-redirect?");
723 // We need an absolute path for the redirect to actually work.
724 std::string redirect_url =
725 GetReachableAbsoluteURL("test_url_loader_data/hello.txt");
726 request.SetURL(redirect_prefix.append(redirect_url));
727 return LoadAndCompareBody(request, "hello\n");
728 }
729
708 // This test should cause a redirect and ensure that the loader runs 730 // This test should cause a redirect and ensure that the loader runs
709 // the callback, rather than following the redirect. 731 // the callback, rather than following the redirect.
710 std::string TestURLLoader::TestAuditURLRedirect() { 732 std::string TestURLLoader::TestAuditURLRedirect() {
711 pp::URLRequestInfo request(instance_); 733 pp::URLRequestInfo request(instance_);
712 // This path will cause the server to return a 301 redirect. 734 // This path will cause the server to return a 301 redirect.
713 request.SetURL("/server-redirect?www.google.com"); 735 // This prefix causes the test server to return a 301 redirect.
736 std::string redirect_prefix("/server-redirect?");
737 // We need an absolute path for the redirect to actually work.
738 std::string redirect_url =
739 GetReachableAbsoluteURL("test_url_loader_data/hello.txt");
740 request.SetURL(redirect_prefix.append(redirect_url));
714 request.SetFollowRedirects(false); 741 request.SetFollowRedirects(false);
715 742
716 TestCompletionCallback callback(instance_->pp_instance(), force_async_); 743 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
717 744
718 pp::URLLoader loader(*instance_); 745 pp::URLLoader loader(*instance_);
719 int32_t rv = loader.Open(request, callback); 746 int32_t rv = loader.Open(request, callback);
720 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) 747 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
721 return ReportError("URLLoader::Open force_async", rv); 748 return ReportError("URLLoader::Open force_async", rv);
722 if (rv == PP_OK_COMPLETIONPENDING) 749 if (rv == PP_OK_COMPLETIONPENDING)
723 rv = callback.WaitForResult(); 750 rv = callback.WaitForResult();
724 if (rv != PP_OK) 751 if (rv != PP_OK)
725 return ReportError("URLLoader::Open", rv); 752 return ReportError("URLLoader::Open", rv);
726 753
727 // Checks that the response indicates a redirect, and that the URL 754 // Checks that the response indicates a redirect, and that the URL
728 // is correct. 755 // is correct.
729 pp::URLResponseInfo response_info(loader.GetResponseInfo()); 756 pp::URLResponseInfo response_info(loader.GetResponseInfo());
730 if (response_info.is_null()) 757 if (response_info.is_null())
731 return "URLLoader::GetResponseInfo returned null"; 758 return "URLLoader::GetResponseInfo returned null";
732 int32_t status_code = response_info.GetStatusCode(); 759 int32_t status_code = response_info.GetStatusCode();
733 if (status_code != 301) 760 if (status_code != 301)
734 return "Response status should be 301"; 761 return "Response status should be 301";
735 if (response_info.GetRedirectURL().AsString() != "www.google.com") 762
736 return "Redirect URL should be www.google.com"; 763 // Test that the paused loader can be resumed.
764 TestCompletionCallback redirect_callback(instance_->pp_instance(),
765 force_async_);
766 rv = loader.FollowRedirect(redirect_callback);
767 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
768 return ReportError("URLLoader::FollowRedirect force_async", rv);
769 if (rv == PP_OK_COMPLETIONPENDING)
770 rv = redirect_callback.WaitForResult();
771 if (rv != PP_OK)
772 return ReportError("URLLoader::FollowRedirect", rv);
773 std::string body;
774 std::string error = ReadEntireResponseBody(&loader, &body);
775 if (!error.empty())
776 return error;
777
778 if (body != "hello\n")
779 return "URLLoader::FollowRedirect failed";
737 780
738 PASS(); 781 PASS();
739 } 782 }
740 783
741 std::string TestURLLoader::TestAbortCalls() { 784 std::string TestURLLoader::TestAbortCalls() {
742 pp::URLRequestInfo request(instance_); 785 pp::URLRequestInfo request(instance_);
743 request.SetURL("test_url_loader_data/hello.txt"); 786 request.SetURL("test_url_loader_data/hello.txt");
744 787
745 TestCompletionCallback callback(instance_->pp_instance(), force_async_); 788 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
746 int32_t rv; 789 int32_t rv;
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
836 std::string body; 879 std::string body;
837 std::string error = ReadEntireResponseBody(&loader, &body); 880 std::string error = ReadEntireResponseBody(&loader, &body);
838 if (!error.empty()) 881 if (!error.empty())
839 return error; 882 return error;
840 if (body != "hello\n") 883 if (body != "hello\n")
841 return ReportError("Couldn't read data", rv); 884 return ReportError("Couldn't read data", rv);
842 885
843 PASS(); 886 PASS();
844 } 887 }
845 888
846 // TODO(viettrungluu): Add tests for FollowRedirect, 889 // TODO(viettrungluu): Add tests for Get{Upload,Download}Progress, Close
847 // Get{Upload,Download}Progress, Close (including abort tests if applicable). 890 // (including abort tests if applicable).
891
OLDNEW
« no previous file with comments | « ppapi/tests/test_url_loader.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698