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