OLD | NEW |
1 /* | 1 /* |
2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
3 * Copyright (C) 2006-2017 eyeo GmbH | 3 * Copyright (C) 2006-2017 eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 { | 106 { |
107 jsEngine->Evaluate("_webRequest.GET('http://example.com/', {X: 'Y'}, function(
result) {foo = result;} )"); | 107 jsEngine->Evaluate("_webRequest.GET('http://example.com/', {X: 'Y'}, function(
result) {foo = result;} )"); |
108 ASSERT_TRUE(jsEngine->Evaluate("this.foo")->IsUndefined()); | 108 ASSERT_TRUE(jsEngine->Evaluate("this.foo")->IsUndefined()); |
109 AdblockPlus::Sleep(200); | 109 AdblockPlus::Sleep(200); |
110 ASSERT_EQ(AdblockPlus::WebRequest::NS_OK, jsEngine->Evaluate("foo.status")->As
Int()); | 110 ASSERT_EQ(AdblockPlus::WebRequest::NS_OK, jsEngine->Evaluate("foo.status")->As
Int()); |
111 ASSERT_EQ(123, jsEngine->Evaluate("foo.responseStatus")->AsInt()); | 111 ASSERT_EQ(123, jsEngine->Evaluate("foo.responseStatus")->AsInt()); |
112 ASSERT_EQ("http://example.com/\nX\nY", jsEngine->Evaluate("foo.responseText")-
>AsString()); | 112 ASSERT_EQ("http://example.com/\nX\nY", jsEngine->Evaluate("foo.responseText")-
>AsString()); |
113 ASSERT_EQ("{\"Foo\":\"Bar\"}", jsEngine->Evaluate("JSON.stringify(foo.response
Headers)")->AsString()); | 113 ASSERT_EQ("{\"Foo\":\"Bar\"}", jsEngine->Evaluate("JSON.stringify(foo.response
Headers)")->AsString()); |
114 } | 114 } |
115 | 115 |
116 TEST_F(MockWebRequestTest, ConnectionIsAllowedOnJsEngine) | |
117 { | |
118 std::atomic<int> isConnectionAllowedCalledTimes(0); | |
119 jsEngine->SetIsConnectionAllowedCallback([&isConnectionAllowedCalledTimes]()->
bool | |
120 { | |
121 ++isConnectionAllowedCalledTimes; | |
122 return true; | |
123 }); | |
124 jsEngine->Evaluate("_webRequest.GET('http://example.com/', {X: 'Y'}, function(
result) {foo = result;} )"); | |
125 ASSERT_TRUE(jsEngine->Evaluate("this.foo")->IsUndefined()); | |
126 AdblockPlus::Sleep(200); | |
127 EXPECT_EQ(1, isConnectionAllowedCalledTimes); | |
128 EXPECT_EQ(AdblockPlus::WebRequest::NS_OK, jsEngine->Evaluate("foo.status")->As
Int()); | |
129 EXPECT_EQ(123, jsEngine->Evaluate("foo.responseStatus")->AsInt()); | |
130 EXPECT_EQ("http://example.com/\nX\nY", jsEngine->Evaluate("foo.responseText")-
>AsString()); | |
131 EXPECT_EQ("{\"Foo\":\"Bar\"}", jsEngine->Evaluate("JSON.stringify(foo.response
Headers)")->AsString()); | |
132 } | |
133 | |
134 TEST_F(MockWebRequestTest, ConnectionIsNotAllowedOnJsEngine) | |
135 { | |
136 std::atomic<int> isConnectionAllowedCalledTimes(0); | |
137 jsEngine->SetIsConnectionAllowedCallback([&isConnectionAllowedCalledTimes]()->
bool | |
138 { | |
139 ++isConnectionAllowedCalledTimes; | |
140 return false; | |
141 }); | |
142 jsEngine->Evaluate("_webRequest.GET('http://example.com/', {X: 'Y'}, function(
result) {foo = result;} )"); | |
143 ASSERT_TRUE(jsEngine->Evaluate("this.foo")->IsUndefined()); | |
144 AdblockPlus::Sleep(200); | |
145 EXPECT_EQ(1, isConnectionAllowedCalledTimes); | |
146 EXPECT_EQ(AdblockPlus::WebRequest::NS_ERROR_CONNECTION_REFUSED, jsEngine->Eval
uate("foo.status")->AsInt()); | |
147 EXPECT_EQ(0, jsEngine->Evaluate("foo.responseStatus")->AsInt()); | |
148 EXPECT_EQ("", jsEngine->Evaluate("foo.responseText")->AsString()); | |
149 EXPECT_EQ("{}", jsEngine->Evaluate("JSON.stringify(foo.responseHeaders)")->AsS
tring()); | |
150 } | |
151 | |
152 namespace | |
153 { | |
154 class SyncStrings | |
155 { | |
156 public: | |
157 void Add(const std::string* value) | |
158 { | |
159 std::lock_guard<std::mutex> lock(mutex); | |
160 strings.emplace_back(!!value, value ? *value : ""); | |
161 } | |
162 std::vector<std::pair<bool, std::string>> GetStrings() const | |
163 { | |
164 std::lock_guard<std::mutex> lock(mutex); | |
165 return strings; | |
166 } | |
167 void Clear() | |
168 { | |
169 std::lock_guard<std::mutex> lock(mutex); | |
170 strings.clear(); | |
171 } | |
172 private: | |
173 mutable std::mutex mutex; | |
174 std::vector<std::pair<bool, std::string>> strings; | |
175 }; | |
176 } | |
177 | |
178 TEST_F(MockWebRequestTest, ConnectionIsAllowedOnFilterEngine1) | |
179 { | |
180 FilterEngine::CreationParameters createParams; | |
181 std::string predefinedAllowedConnectionType = "non-metered"; | |
182 createParams.preconfiguredPrefs.emplace("allowed_connection_type", jsEngine->N
ewValue(predefinedAllowedConnectionType)); | |
183 auto receivedConnectionTypes = std::make_shared<SyncStrings>(); | |
184 createParams.isConnectionAllowedCallback = [receivedConnectionTypes](const std
::string* allowedConnectionType)->bool { | |
185 receivedConnectionTypes->Add(allowedConnectionType); | |
186 return true; | |
187 }; | |
188 auto filterEngine = FilterEngine::Create(jsEngine, createParams); | |
189 jsEngine->Evaluate("_webRequest.GET('http://example.com/', {X: 'Y'}, function(
result) {foo = result;} )"); | |
190 ASSERT_TRUE(jsEngine->Evaluate("this.foo")->IsUndefined()); | |
191 AdblockPlus::Sleep(200); | |
192 auto receivedConnectionTypesStrings = receivedConnectionTypes->GetStrings(); | |
193 EXPECT_FALSE(receivedConnectionTypesStrings.empty()); | |
194 for (const auto& connectionType : receivedConnectionTypesStrings) | |
195 { | |
196 EXPECT_TRUE(connectionType.first); | |
197 EXPECT_EQ(predefinedAllowedConnectionType, connectionType.second); | |
198 } | |
199 EXPECT_EQ(AdblockPlus::WebRequest::NS_OK, jsEngine->Evaluate("foo.status")->As
Int()); | |
200 EXPECT_EQ(123, jsEngine->Evaluate("foo.responseStatus")->AsInt()); | |
201 EXPECT_EQ("http://example.com/\nX\nY", jsEngine->Evaluate("foo.responseText")-
>AsString()); | |
202 EXPECT_EQ("{\"Foo\":\"Bar\"}", jsEngine->Evaluate("JSON.stringify(foo.response
Headers)")->AsString()); | |
203 } | |
204 | |
205 TEST_F(MockWebRequestTest, ConnectionIsAllowedOnFilterEngine2) | |
206 { | |
207 FilterEngine::CreationParameters createParams; | |
208 auto receivedConnectionTypes = std::make_shared<SyncStrings>(); | |
209 createParams.isConnectionAllowedCallback = [receivedConnectionTypes](const std
::string* allowedConnectionType)->bool { | |
210 receivedConnectionTypes->Add(allowedConnectionType); | |
211 return true; | |
212 }; | |
213 auto filterEngine = FilterEngine::Create(jsEngine, createParams); | |
214 jsEngine->Evaluate("_webRequest.GET('http://example.com/', {X: 'Y'}, function(
result) {foo = result;} )"); | |
215 ASSERT_TRUE(jsEngine->Evaluate("this.foo")->IsUndefined()); | |
216 AdblockPlus::Sleep(200); | |
217 auto receivedConnectionTypesStrings = receivedConnectionTypes->GetStrings(); | |
218 EXPECT_FALSE(receivedConnectionTypesStrings.empty()); | |
219 for (const auto& connectionType : receivedConnectionTypesStrings) | |
220 { | |
221 EXPECT_FALSE(connectionType.first); | |
222 } | |
223 EXPECT_EQ(AdblockPlus::WebRequest::NS_OK, jsEngine->Evaluate("foo.status")->As
Int()); | |
224 EXPECT_EQ(123, jsEngine->Evaluate("foo.responseStatus")->AsInt()); | |
225 EXPECT_EQ("http://example.com/\nX\nY", jsEngine->Evaluate("foo.responseText")-
>AsString()); | |
226 EXPECT_EQ("{\"Foo\":\"Bar\"}", jsEngine->Evaluate("JSON.stringify(foo.response
Headers)")->AsString()); | |
227 } | |
228 | |
229 TEST_F(MockWebRequestTest, ConnectionIsAllowedOnFilterEngine3) | |
230 { | |
231 // initially allowed connection type is not defined | |
232 FilterEngine::CreationParameters createParams; | |
233 auto receivedConnectionTypes = std::make_shared<SyncStrings>(); | |
234 createParams.isConnectionAllowedCallback = [receivedConnectionTypes](const std
::string* allowedConnectionType)->bool { | |
235 receivedConnectionTypes->Add(allowedConnectionType); | |
236 return true; | |
237 }; | |
238 auto filterEngine = FilterEngine::Create(jsEngine, createParams); | |
239 | |
240 jsEngine->Evaluate("_webRequest.GET('http://example.com/', {X: 'Y'}, function(
result) {foo = result;} )"); | |
241 ASSERT_TRUE(jsEngine->Evaluate("this.foo")->IsUndefined()); | |
242 AdblockPlus::Sleep(200); | |
243 auto receivedConnectionTypesStrings = receivedConnectionTypes->GetStrings(); | |
244 EXPECT_FALSE(receivedConnectionTypesStrings.empty()); | |
245 for (const auto& connectionType : receivedConnectionTypesStrings) | |
246 { | |
247 EXPECT_FALSE(connectionType.first); | |
248 } | |
249 EXPECT_EQ(AdblockPlus::WebRequest::NS_OK, jsEngine->Evaluate("foo.status")->As
Int()); | |
250 EXPECT_EQ(123, jsEngine->Evaluate("foo.responseStatus")->AsInt()); | |
251 EXPECT_EQ("http://example.com/\nX\nY", jsEngine->Evaluate("foo.responseText")-
>AsString()); | |
252 EXPECT_EQ("{\"Foo\":\"Bar\"}", jsEngine->Evaluate("JSON.stringify(foo.response
Headers)")->AsString()); | |
253 | |
254 // set allowed connection type | |
255 std::string allowedConnectionType = "test-connection"; | |
256 filterEngine->SetAllowedConnectionType(&allowedConnectionType); | |
257 receivedConnectionTypes->Clear(); | |
258 jsEngine->Evaluate("_webRequest.GET('http://example.com/', {X: 'Y'}, function(
result) {foo = result;} )"); | |
259 AdblockPlus::Sleep(200); | |
260 receivedConnectionTypesStrings = receivedConnectionTypes->GetStrings(); | |
261 EXPECT_FALSE(receivedConnectionTypesStrings.empty()); | |
262 for (const auto& connectionType : receivedConnectionTypesStrings) | |
263 { | |
264 EXPECT_TRUE(connectionType.first); | |
265 EXPECT_EQ(allowedConnectionType, connectionType.second); | |
266 } | |
267 | |
268 // remove allowed connection type | |
269 filterEngine->SetAllowedConnectionType(nullptr); | |
270 receivedConnectionTypes->Clear(); | |
271 jsEngine->Evaluate("_webRequest.GET('http://example.com/', {X: 'Y'}, function(
result) {foo = result;} )"); | |
272 AdblockPlus::Sleep(200); | |
273 receivedConnectionTypesStrings = receivedConnectionTypes->GetStrings(); | |
274 EXPECT_FALSE(receivedConnectionTypesStrings.empty()); | |
275 for (const auto& connectionType : receivedConnectionTypesStrings) | |
276 { | |
277 EXPECT_FALSE(connectionType.first); | |
278 } | |
279 } | |
280 | |
281 TEST_F(MockWebRequestTest, ConnectionIsNotAllowedOnFilterEngine) | |
282 { | |
283 FilterEngine::CreationParameters createParams; | |
284 std::string predefinedAllowedConnectionType = "non-metered"; | |
285 createParams.preconfiguredPrefs.emplace("allowed_connection_type", jsEngine->N
ewValue(predefinedAllowedConnectionType)); | |
286 auto receivedConnectionTypes = std::make_shared<SyncStrings>(); | |
287 createParams.isConnectionAllowedCallback = [receivedConnectionTypes](const std
::string* allowedConnectionType)->bool { | |
288 receivedConnectionTypes->Add(allowedConnectionType); | |
289 return false; | |
290 }; | |
291 auto filterEngine = FilterEngine::Create(jsEngine, createParams); | |
292 jsEngine->Evaluate("_webRequest.GET('http://example.com/', {X: 'Y'}, function(
result) {foo = result;} )"); | |
293 ASSERT_TRUE(jsEngine->Evaluate("this.foo")->IsUndefined()); | |
294 AdblockPlus::Sleep(200); | |
295 auto receivedConnectionTypesStrings = receivedConnectionTypes->GetStrings(); | |
296 EXPECT_FALSE(receivedConnectionTypesStrings.empty()); | |
297 for (const auto& connectionType : receivedConnectionTypesStrings) | |
298 { | |
299 EXPECT_TRUE(connectionType.first); | |
300 EXPECT_EQ(predefinedAllowedConnectionType, connectionType.second); | |
301 } | |
302 EXPECT_EQ(AdblockPlus::WebRequest::NS_ERROR_CONNECTION_REFUSED, jsEngine->Eval
uate("foo.status")->AsInt()); | |
303 EXPECT_EQ(0, jsEngine->Evaluate("foo.responseStatus")->AsInt()); | |
304 EXPECT_EQ("", jsEngine->Evaluate("foo.responseText")->AsString()); | |
305 EXPECT_EQ("{}", jsEngine->Evaluate("JSON.stringify(foo.responseHeaders)")->AsS
tring()); | |
306 } | |
307 | |
308 #if defined(HAVE_CURL) || defined(_WIN32) | 116 #if defined(HAVE_CURL) || defined(_WIN32) |
309 TEST_F(DefaultWebRequestTest, RealWebRequest) | 117 TEST_F(DefaultWebRequestTest, RealWebRequest) |
310 { | 118 { |
311 // This URL should redirect to easylist-downloads.adblockplus.org and we | 119 // This URL should redirect to easylist-downloads.adblockplus.org and we |
312 // should get the actual filter list back. | 120 // should get the actual filter list back. |
313 jsEngine->Evaluate("_webRequest.GET('https://easylist-downloads.adblockplus.or
g/easylist.txt', {}, function(result) {foo = result;} )"); | 121 jsEngine->Evaluate("_webRequest.GET('https://easylist-downloads.adblockplus.or
g/easylist.txt', {}, function(result) {foo = result;} )"); |
314 WaitForVariable("this.foo", jsEngine); | 122 WaitForVariable("this.foo", jsEngine); |
315 ASSERT_EQ("text/plain", jsEngine->Evaluate("foo.responseHeaders['content-type'
].substr(0, 10)")->AsString()); | 123 ASSERT_EQ("text/plain", jsEngine->Evaluate("foo.responseHeaders['content-type'
].substr(0, 10)")->AsString()); |
316 ASSERT_EQ(AdblockPlus::WebRequest::NS_OK, jsEngine->Evaluate("foo.status")->As
Int()); | 124 ASSERT_EQ(AdblockPlus::WebRequest::NS_OK, jsEngine->Evaluate("foo.status")->As
Int()); |
317 ASSERT_EQ(200, jsEngine->Evaluate("foo.responseStatus")->AsInt()); | 125 ASSERT_EQ(200, jsEngine->Evaluate("foo.responseStatus")->AsInt()); |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 catchLogSystem->clear(); | 285 catchLogSystem->clear(); |
478 ResetTestXHR(jsEngine); | 286 ResetTestXHR(jsEngine); |
479 jsEngine->Evaluate("\ | 287 jsEngine->Evaluate("\ |
480 request.setRequestHeader('Security', 'theater');\nrequest.send();"); | 288 request.setRequestHeader('Security', 'theater');\nrequest.send();"); |
481 EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_TRACE, catchLogSystem->lastLogLeve
l); | 289 EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_TRACE, catchLogSystem->lastLogLeve
l); |
482 EXPECT_EQ("", catchLogSystem->lastMessage); | 290 EXPECT_EQ("", catchLogSystem->lastMessage); |
483 WaitForVariable("result", jsEngine); | 291 WaitForVariable("result", jsEngine); |
484 EXPECT_FALSE(webRequest->lastRequestHeaders.cend() == | 292 EXPECT_FALSE(webRequest->lastRequestHeaders.cend() == |
485 webRequest->lastRequestHeaders.find("Security")); | 293 webRequest->lastRequestHeaders.find("Security")); |
486 } | 294 } |
OLD | NEW |