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 3// found in the LICENSE file. 4 5#include "base/compiler_specific.h" 6#include "content/public/common/user_agent.h" 7#include "content/public/test/render_view_test.h" 8#include "content/renderer/pepper/url_request_info_util.h" 9#include "ppapi/proxy/connection.h" 10#include "ppapi/proxy/url_request_info_resource.h" 11#include "ppapi/shared_impl/proxy_lock.h" 12#include "ppapi/shared_impl/test_globals.h" 13#include "ppapi/shared_impl/url_request_info_data.h" 14#include "ppapi/thunk/thunk.h" 15#include "testing/gtest/include/gtest/gtest.h" 16#include "third_party/WebKit/public/platform/WebURLRequest.h" 17#include "third_party/WebKit/public/web/WebFrameClient.h" 18#include "third_party/WebKit/public/web/WebLocalFrame.h" 19#include "third_party/WebKit/public/web/WebView.h" 20 21// This test is a end-to-end test from the resource to the WebKit request 22// object. The actual resource implementation is so simple, it makes sense to 23// test it by making sure the conversion routines actually work at the same 24// time. 25 26using blink::WebCString; 27using blink::WebFrameClient; 28using blink::WebString; 29using blink::WebView; 30using blink::WebURL; 31using blink::WebURLRequest; 32 33namespace { 34 35bool IsExpected(const WebCString& web_string, const char* expected) { 36 const char* result = web_string.data(); 37 return strcmp(result, expected) == 0; 38} 39 40bool IsExpected(const WebString& web_string, const char* expected) { 41 return IsExpected(web_string.utf8(), expected); 42} 43 44// The base class destructor is protected, so derive. 45class TestWebFrameClient : public WebFrameClient {}; 46 47} // namespace 48 49using ppapi::proxy::URLRequestInfoResource; 50using ppapi::URLRequestInfoData; 51 52namespace content { 53 54class URLRequestInfoTest : public RenderViewTest { 55 public: 56 // Note: using -1 as the instance value allows code in 57 // url_request_info_util.cc to detect that this is a test instance. 58 URLRequestInfoTest() : pp_instance_(-1) {} 59 60 virtual void SetUp() OVERRIDE { 61 RenderViewTest::SetUp(); 62 ppapi::ProxyLock::DisableLockingOnThreadForTest(); 63 64 test_globals_.GetResourceTracker()->DidCreateInstance(pp_instance_); 65 66 // This resource doesn't do IPC, so a null connection is fine. 67 info_ = new URLRequestInfoResource( 68 ppapi::proxy::Connection(), pp_instance_, URLRequestInfoData()); 69 } 70 71 virtual void TearDown() OVERRIDE { 72 test_globals_.GetResourceTracker()->DidDeleteInstance(pp_instance_); 73 RenderViewTest::TearDown(); 74 } 75 76 bool GetDownloadToFile() { 77 WebURLRequest web_request; 78 URLRequestInfoData data = info_->GetData(); 79 if (!CreateWebURLRequest(pp_instance_, &data, GetMainFrame(), &web_request)) 80 return false; 81 return web_request.downloadToFile(); 82 } 83 84 WebCString GetURL() { 85 WebURLRequest web_request; 86 URLRequestInfoData data = info_->GetData(); 87 if (!CreateWebURLRequest(pp_instance_, &data, GetMainFrame(), &web_request)) 88 return WebCString(); 89 return web_request.url().spec(); 90 } 91 92 WebString GetMethod() { 93 WebURLRequest web_request; 94 URLRequestInfoData data = info_->GetData(); 95 if (!CreateWebURLRequest(pp_instance_, &data, GetMainFrame(), &web_request)) 96 return WebString(); 97 return web_request.httpMethod(); 98 } 99 100 WebString GetHeaderValue(const char* field) { 101 WebURLRequest web_request; 102 URLRequestInfoData data = info_->GetData(); 103 if (!CreateWebURLRequest(pp_instance_, &data, GetMainFrame(), &web_request)) 104 return WebString(); 105 return web_request.httpHeaderField(WebString::fromUTF8(field)); 106 } 107 108 bool SetBooleanProperty(PP_URLRequestProperty prop, bool b) { 109 return info_->SetBooleanProperty(prop, b); 110 } 111 bool SetStringProperty(PP_URLRequestProperty prop, const std::string& s) { 112 return info_->SetStringProperty(prop, s); 113 } 114 115 PP_Instance pp_instance_; 116 117 // Needs to be alive for resource tracking to work. 118 ppapi::TestGlobals test_globals_; 119 120 scoped_refptr<URLRequestInfoResource> info_; 121}; 122 123TEST_F(URLRequestInfoTest, GetInterface) { 124 const PPB_URLRequestInfo* request_info = 125 ppapi::thunk::GetPPB_URLRequestInfo_1_0_Thunk(); 126 EXPECT_TRUE(request_info); 127 EXPECT_TRUE(request_info->Create); 128 EXPECT_TRUE(request_info->IsURLRequestInfo); 129 EXPECT_TRUE(request_info->SetProperty); 130 EXPECT_TRUE(request_info->AppendDataToBody); 131 EXPECT_TRUE(request_info->AppendFileToBody); 132} 133 134TEST_F(URLRequestInfoTest, AsURLRequestInfo) { 135 EXPECT_EQ(info_.get(), info_->AsPPB_URLRequestInfo_API()); 136} 137 138TEST_F(URLRequestInfoTest, StreamToFile) { 139 SetStringProperty(PP_URLREQUESTPROPERTY_URL, "http://www.google.com"); 140 141 EXPECT_FALSE(GetDownloadToFile()); 142 143 EXPECT_TRUE(SetBooleanProperty(PP_URLREQUESTPROPERTY_STREAMTOFILE, true)); 144 EXPECT_TRUE(GetDownloadToFile()); 145 146 EXPECT_TRUE(SetBooleanProperty(PP_URLREQUESTPROPERTY_STREAMTOFILE, false)); 147 EXPECT_FALSE(GetDownloadToFile()); 148} 149 150TEST_F(URLRequestInfoTest, FollowRedirects) { 151 EXPECT_TRUE(info_->GetData().follow_redirects); 152 153 EXPECT_TRUE(SetBooleanProperty(PP_URLREQUESTPROPERTY_FOLLOWREDIRECTS, false)); 154 EXPECT_FALSE(info_->GetData().follow_redirects); 155 156 EXPECT_TRUE(SetBooleanProperty(PP_URLREQUESTPROPERTY_FOLLOWREDIRECTS, true)); 157 EXPECT_TRUE(info_->GetData().follow_redirects); 158} 159 160TEST_F(URLRequestInfoTest, RecordDownloadProgress) { 161 EXPECT_FALSE(info_->GetData().record_download_progress); 162 163 EXPECT_TRUE( 164 SetBooleanProperty(PP_URLREQUESTPROPERTY_RECORDDOWNLOADPROGRESS, true)); 165 EXPECT_TRUE(info_->GetData().record_download_progress); 166 167 EXPECT_TRUE( 168 SetBooleanProperty(PP_URLREQUESTPROPERTY_RECORDDOWNLOADPROGRESS, false)); 169 EXPECT_FALSE(info_->GetData().record_download_progress); 170} 171 172TEST_F(URLRequestInfoTest, RecordUploadProgress) { 173 EXPECT_FALSE(info_->GetData().record_upload_progress); 174 175 EXPECT_TRUE( 176 SetBooleanProperty(PP_URLREQUESTPROPERTY_RECORDUPLOADPROGRESS, true)); 177 EXPECT_TRUE(info_->GetData().record_upload_progress); 178 179 EXPECT_TRUE( 180 SetBooleanProperty(PP_URLREQUESTPROPERTY_RECORDUPLOADPROGRESS, false)); 181 EXPECT_FALSE(info_->GetData().record_upload_progress); 182} 183 184TEST_F(URLRequestInfoTest, AllowCrossOriginRequests) { 185 EXPECT_FALSE(info_->GetData().allow_cross_origin_requests); 186 187 EXPECT_TRUE( 188 SetBooleanProperty(PP_URLREQUESTPROPERTY_ALLOWCROSSORIGINREQUESTS, true)); 189 EXPECT_TRUE(info_->GetData().allow_cross_origin_requests); 190 191 EXPECT_TRUE(SetBooleanProperty(PP_URLREQUESTPROPERTY_ALLOWCROSSORIGINREQUESTS, 192 false)); 193 EXPECT_FALSE(info_->GetData().allow_cross_origin_requests); 194} 195 196TEST_F(URLRequestInfoTest, AllowCredentials) { 197 EXPECT_FALSE(info_->GetData().allow_credentials); 198 199 EXPECT_TRUE(SetBooleanProperty(PP_URLREQUESTPROPERTY_ALLOWCREDENTIALS, true)); 200 EXPECT_TRUE(info_->GetData().allow_credentials); 201 202 EXPECT_TRUE( 203 SetBooleanProperty(PP_URLREQUESTPROPERTY_ALLOWCREDENTIALS, false)); 204 EXPECT_FALSE(info_->GetData().allow_credentials); 205} 206 207TEST_F(URLRequestInfoTest, SetURL) { 208 const char* url = "http://www.google.com/"; 209 EXPECT_TRUE(SetStringProperty(PP_URLREQUESTPROPERTY_URL, url)); 210 EXPECT_TRUE(IsExpected(GetURL(), url)); 211} 212 213TEST_F(URLRequestInfoTest, JavascriptURL) { 214 const char* url = "javascript:foo = bar"; 215 EXPECT_FALSE(URLRequestRequiresUniversalAccess(info_->GetData())); 216 SetStringProperty(PP_URLREQUESTPROPERTY_URL, url); 217 EXPECT_TRUE(URLRequestRequiresUniversalAccess(info_->GetData())); 218} 219 220TEST_F(URLRequestInfoTest, SetMethod) { 221 // Test default method is "GET". 222 EXPECT_TRUE(IsExpected(GetMethod(), "GET")); 223 EXPECT_TRUE(SetStringProperty(PP_URLREQUESTPROPERTY_METHOD, "POST")); 224 EXPECT_TRUE(IsExpected(GetMethod(), "POST")); 225} 226 227TEST_F(URLRequestInfoTest, SetHeaders) { 228 // Test default header field. 229 EXPECT_TRUE(IsExpected(GetHeaderValue("foo"), "")); 230 // Test that we can set a header field. 231 EXPECT_TRUE(SetStringProperty(PP_URLREQUESTPROPERTY_HEADERS, "foo: bar")); 232 EXPECT_TRUE(IsExpected(GetHeaderValue("foo"), "bar")); 233 // Test that we can set multiple header fields using \n delimiter. 234 EXPECT_TRUE( 235 SetStringProperty(PP_URLREQUESTPROPERTY_HEADERS, "foo: bar\nbar: baz")); 236 EXPECT_TRUE(IsExpected(GetHeaderValue("foo"), "bar")); 237 EXPECT_TRUE(IsExpected(GetHeaderValue("bar"), "baz")); 238} 239 240// TODO(bbudge) Unit tests for AppendDataToBody, AppendFileToBody. 241 242} // namespace content 243