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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ppapi/tests/test_url_loader.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ppapi/tests/test_url_loader.cc
===================================================================
--- ppapi/tests/test_url_loader.cc (revision 113699)
+++ ppapi/tests/test_url_loader.cc (working copy)
@@ -9,7 +9,6 @@
#include <string>
#include "ppapi/c/dev/ppb_testing_dev.h"
-#include "ppapi/c/dev/ppb_url_util_dev.h"
#include "ppapi/c/pp_errors.h"
#include "ppapi/c/ppb_file_io.h"
#include "ppapi/c/ppb_url_loader.h"
@@ -122,6 +121,7 @@
RUN_TEST_FORCEASYNC_AND_NOT(TrustedJavascriptURLRestriction, filter);
RUN_TEST_FORCEASYNC_AND_NOT(UntrustedHttpRequests, filter);
RUN_TEST_FORCEASYNC_AND_NOT(TrustedHttpRequests, filter);
+ RUN_TEST_FORCEASYNC_AND_NOT(FollowURLRedirect, filter);
RUN_TEST_FORCEASYNC_AND_NOT(AuditURLRedirect, filter);
RUN_TEST_FORCEASYNC_AND_NOT(AbortCalls, filter);
RUN_TEST_FORCEASYNC_AND_NOT(UntendedLoad, filter);
@@ -253,29 +253,39 @@
return rv;
}
-std::string TestURLLoader::GetReachableCrossOriginURL() {
- // Get the document URL and use it to construct a URL that will be
- // considered cross-origin by the WebKit access control code, and yet be
+std::string TestURLLoader::GetReachableAbsoluteURL(
+ const std::string& file_name) {
+ // Request the test page and scrape the absolute URL that the server returns
+ // as part of the response. Using the test page allows us to test redirected
+ // and cross-origin requests since we have a mock headers file.
+ pp::URLRequestInfo request(instance_);
+ request.SetURL(file_name);
+ TestCompletionCallback callback(instance_->pp_instance(), force_async_);
+
+ pp::URLLoader loader(*instance_);
+ int32_t rv = loader.Open(request, callback);
+ if (rv == PP_OK_COMPLETIONPENDING)
+ rv = callback.WaitForResult();
+ ASSERT_EQ(rv, PP_OK);
+
+ pp::URLResponseInfo response_info(loader.GetResponseInfo());
+ ASSERT_FALSE(response_info.is_null());
+ ASSERT_EQ(response_info.GetStatusCode(), 200);
+ return response_info.GetURL().AsString();
+}
+
+std::string TestURLLoader::GetReachableCrossOriginURL(
+ const std::string& file_name) {
+ // Get an absolute URL and use it to construct a URL that will be
+ // considered cross-origin by the CORS access control code, and yet be
// reachable by the test server.
- PP_URLComponents_Dev components;
- pp::Var pp_document_url = pp::URLUtil_Dev::Get()->GetDocumentURL(
- *instance_, &components);
- std::string document_url = pp_document_url.AsString();
- // Replace "127.0.0.1" with "localhost". Or vice versa.
- bool changedHost = false;
- if (document_url.find("127.0.0.1") != std::string::npos) {
- document_url.replace(components.host.begin,
- components.host.len,
- "localhost");
- changedHost = true;
- } else if (document_url.find("localhost") != std::string::npos) {
- document_url.replace(components.host.begin,
- components.host.len,
- "127.0.0.1");
- changedHost = true;
- }
- ASSERT_TRUE(changedHost);
- return document_url;
+ std::string url = GetReachableAbsoluteURL(file_name);
+ // Replace '127.0.0.1' with 'localhost'.
+ std::string host("127.0.0.1");
+ size_t index = url.find(host);
+ ASSERT_NE(index, std::string::npos);
+ url.replace(index, host.length(), "localhost");
+ return url;
}
int32_t TestURLLoader::OpenUntrusted(const std::string& method,
@@ -507,7 +517,7 @@
// Untrusted, unintended cross-origin requests should fail.
std::string TestURLLoader::TestUntrustedSameOriginRestriction() {
pp::URLRequestInfo request(instance_);
- std::string cross_origin_url = GetReachableCrossOriginURL();
+ std::string cross_origin_url = GetReachableCrossOriginURL("test_case.html");
request.SetURL(cross_origin_url);
int32_t rv = OpenUntrusted(request);
@@ -521,7 +531,7 @@
// Trusted, unintended cross-origin requests should succeed.
std::string TestURLLoader::TestTrustedSameOriginRestriction() {
pp::URLRequestInfo request(instance_);
- std::string cross_origin_url = GetReachableCrossOriginURL();
+ std::string cross_origin_url = GetReachableCrossOriginURL("test_case.html");
request.SetURL(cross_origin_url);
int32_t rv = OpenTrusted(request);
@@ -534,7 +544,7 @@
// Untrusted, intended cross-origin requests should use CORS and succeed.
std::string TestURLLoader::TestUntrustedCrossOriginRequest() {
pp::URLRequestInfo request(instance_);
- std::string cross_origin_url = GetReachableCrossOriginURL();
+ std::string cross_origin_url = GetReachableCrossOriginURL("test_case.html");
request.SetURL(cross_origin_url);
request.SetAllowCrossOriginRequests(true);
@@ -549,7 +559,7 @@
// Trusted, intended cross-origin requests should use CORS and succeed.
std::string TestURLLoader::TestTrustedCrossOriginRequest() {
pp::URLRequestInfo request(instance_);
- std::string cross_origin_url = GetReachableCrossOriginURL();
+ std::string cross_origin_url = GetReachableCrossOriginURL("test_case.html");
request.SetURL(cross_origin_url);
request.SetAllowCrossOriginRequests(true);
@@ -705,12 +715,29 @@
PASS();
}
+// This test should cause a redirect and ensure that the loader follows it.
+std::string TestURLLoader::TestFollowURLRedirect() {
+ pp::URLRequestInfo request(instance_);
+ // This prefix causes the test server to return a 301 redirect.
+ std::string redirect_prefix("/server-redirect?");
+ // We need an absolute path for the redirect to actually work.
+ std::string redirect_url =
+ GetReachableAbsoluteURL("test_url_loader_data/hello.txt");
+ request.SetURL(redirect_prefix.append(redirect_url));
+ return LoadAndCompareBody(request, "hello\n");
+}
+
// This test should cause a redirect and ensure that the loader runs
// the callback, rather than following the redirect.
std::string TestURLLoader::TestAuditURLRedirect() {
pp::URLRequestInfo request(instance_);
// This path will cause the server to return a 301 redirect.
- request.SetURL("/server-redirect?www.google.com");
+ // This prefix causes the test server to return a 301 redirect.
+ std::string redirect_prefix("/server-redirect?");
+ // We need an absolute path for the redirect to actually work.
+ std::string redirect_url =
+ GetReachableAbsoluteURL("test_url_loader_data/hello.txt");
+ request.SetURL(redirect_prefix.append(redirect_url));
request.SetFollowRedirects(false);
TestCompletionCallback callback(instance_->pp_instance(), force_async_);
@@ -732,9 +759,25 @@
int32_t status_code = response_info.GetStatusCode();
if (status_code != 301)
return "Response status should be 301";
- if (response_info.GetRedirectURL().AsString() != "www.google.com")
- return "Redirect URL should be www.google.com";
+ // Test that the paused loader can be resumed.
+ TestCompletionCallback redirect_callback(instance_->pp_instance(),
+ force_async_);
+ rv = loader.FollowRedirect(redirect_callback);
+ if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
+ return ReportError("URLLoader::FollowRedirect force_async", rv);
+ if (rv == PP_OK_COMPLETIONPENDING)
+ rv = redirect_callback.WaitForResult();
+ if (rv != PP_OK)
+ return ReportError("URLLoader::FollowRedirect", rv);
+ std::string body;
+ std::string error = ReadEntireResponseBody(&loader, &body);
+ if (!error.empty())
+ return error;
+
+ if (body != "hello\n")
+ return "URLLoader::FollowRedirect failed";
+
PASS();
}
@@ -843,5 +886,6 @@
PASS();
}
-// TODO(viettrungluu): Add tests for FollowRedirect,
-// Get{Upload,Download}Progress, Close (including abort tests if applicable).
+// TODO(viettrungluu): Add tests for Get{Upload,Download}Progress, Close
+// (including abort tests if applicable).
+
« 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