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 |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 * GNU General Public License for more details. | 12 * GNU General Public License for more details. |
13 * | 13 * |
14 * You should have received a copy of the GNU General Public License | 14 * You should have received a copy of the GNU General Public License |
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
16 */ | 16 */ |
17 | 17 |
18 #include <functional> | 18 #include <functional> |
19 | 19 |
20 #include "BaseJsTest.h" | 20 #include "BaseJsTest.h" |
21 | 21 |
22 using namespace AdblockPlus; | 22 using namespace AdblockPlus; |
23 | 23 |
24 namespace | 24 namespace |
25 { | 25 { |
26 typedef std::shared_ptr<AdblockPlus::FilterEngine> FilterEnginePtr; | |
27 | |
28 void FindAndReplace(std::string& source, const std::string& find, const std::s
tring& replace) | 26 void FindAndReplace(std::string& source, const std::string& find, const std::s
tring& replace) |
29 { | 27 { |
30 for (size_t pos = 0; (pos = source.find(find), pos) != std::string::npos; po
s += replace.size()) | 28 for (size_t pos = 0; (pos = source.find(find), pos) != std::string::npos; po
s += replace.size()) |
31 source.replace(pos, find.size(), replace); | 29 source.replace(pos, find.size(), replace); |
32 } | 30 } |
33 | 31 |
34 class UpdateCheckTest : public BaseJsTest | 32 class UpdateCheckTest : public BaseJsTest |
35 { | 33 { |
36 protected: | 34 protected: |
37 AdblockPlus::AppInfo appInfo; | 35 AdblockPlus::AppInfo appInfo; |
38 AdblockPlus::ServerResponse webRequestResponse; | 36 AdblockPlus::ServerResponse webRequestResponse; |
39 DelayedWebRequest::SharedTasks webRequestTasks; | 37 DelayedWebRequest::SharedTasks webRequestTasks; |
40 DelayedTimer::SharedTasks timerTasks; | 38 DelayedTimer::SharedTasks timerTasks; |
41 FilterEnginePtr filterEngine; | |
42 | 39 |
43 bool eventCallbackCalled; | 40 bool eventCallbackCalled; |
44 AdblockPlus::JsValueList eventCallbackParams; | 41 AdblockPlus::JsValueList eventCallbackParams; |
45 bool updateCallbackCalled; | 42 bool updateCallbackCalled; |
46 std::string updateError; | 43 std::string updateError; |
47 | 44 |
48 void SetUp() | 45 void SetUp() |
49 { | 46 { |
50 eventCallbackCalled = false; | 47 eventCallbackCalled = false; |
51 updateCallbackCalled = false; | 48 updateCallbackCalled = false; |
52 } | 49 } |
53 | 50 |
54 void CreateFilterEngine() | 51 void CreateFilterEngine() |
55 { | 52 { |
56 LazyFileSystem* fileSystem; | 53 LazyFileSystem* fileSystem; |
57 ThrowingPlatformCreationParameters platformParams; | 54 ThrowingPlatformCreationParameters platformParams; |
58 platformParams.logSystem.reset(new LazyLogSystem()); | 55 platformParams.logSystem.reset(new LazyLogSystem()); |
59 platformParams.timer = DelayedTimer::New(timerTasks); | 56 platformParams.timer = DelayedTimer::New(timerTasks); |
60 platformParams.fileSystem.reset(fileSystem = new LazyFileSystem()); | 57 platformParams.fileSystem.reset(fileSystem = new LazyFileSystem()); |
61 platformParams.webRequest = DelayedWebRequest::New(webRequestTasks); | 58 platformParams.webRequest = DelayedWebRequest::New(webRequestTasks); |
62 platform.reset(new Platform(std::move(platformParams))); | 59 platform.reset(new Platform(std::move(platformParams))); |
63 platform->SetUpJsEngine(appInfo); | 60 platform->SetUpJsEngine(appInfo); |
64 GetJsEngine().SetEventCallback("updateAvailable", [this](JsValueList&& par
ams) | 61 GetJsEngine().SetEventCallback("updateAvailable", [this](JsValueList&& par
ams) |
65 { | 62 { |
66 eventCallbackCalled = true; | 63 eventCallbackCalled = true; |
67 eventCallbackParams = std::move(params); | 64 eventCallbackParams = std::move(params); |
68 }); | 65 }); |
69 | 66 |
70 filterEngine = ::CreateFilterEngine(*fileSystem, *platform); | 67 ::CreateFilterEngine(*fileSystem, *platform); |
71 } | 68 } |
72 | 69 |
73 // Returns a URL or the empty string if there is no such request. | 70 // Returns a URL or the empty string if there is no such request. |
74 std::string ProcessPendingUpdateWebRequest() | 71 std::string ProcessPendingUpdateWebRequest() |
75 { | 72 { |
76 auto ii = webRequestTasks->begin(); | 73 auto ii = webRequestTasks->begin(); |
77 while (ii != webRequestTasks->end()) | 74 while (ii != webRequestTasks->end()) |
78 { | 75 { |
79 if (ii->url.find("update.json") != std::string::npos) | 76 if (ii->url.find("update.json") != std::string::npos) |
80 { | 77 { |
81 ii->getCallback(webRequestResponse); | 78 ii->getCallback(webRequestResponse); |
82 auto url = ii->url; | 79 auto url = ii->url; |
83 webRequestTasks->erase(ii); | 80 webRequestTasks->erase(ii); |
84 return url; | 81 return url; |
85 } | 82 } |
86 ++ii; | 83 ++ii; |
87 } | 84 } |
88 return std::string(); | 85 return std::string(); |
89 } | 86 } |
90 | 87 |
91 void ForceUpdateCheck() | 88 void ForceUpdateCheck() |
92 { | 89 { |
93 filterEngine->ForceUpdateCheck([this](const std::string& error) | 90 platform->GetFilterEngine().ForceUpdateCheck([this](const std::string& err
or) |
94 { | 91 { |
95 updateCallbackCalled = true; | 92 updateCallbackCalled = true; |
96 updateError = error; | 93 updateError = error; |
97 }); | 94 }); |
98 DelayedTimer::ProcessImmediateTimers(timerTasks); | 95 DelayedTimer::ProcessImmediateTimers(timerTasks); |
99 } | 96 } |
100 }; | 97 }; |
101 } | 98 } |
102 | 99 |
103 TEST_F(UpdateCheckTest, RequestFailure) | 100 TEST_F(UpdateCheckTest, RequestFailure) |
104 { | 101 { |
105 webRequestResponse.status = IWebRequest::NS_ERROR_FAILURE; | 102 webRequestResponse.status = IWebRequest::NS_ERROR_FAILURE; |
106 | 103 |
107 appInfo.name = "1"; | 104 appInfo.name = "1"; |
108 appInfo.version = "3"; | 105 appInfo.version = "3"; |
109 appInfo.application = "4"; | 106 appInfo.application = "4"; |
110 appInfo.applicationVersion = "2"; | 107 appInfo.applicationVersion = "2"; |
111 appInfo.developmentBuild = false; | 108 appInfo.developmentBuild = false; |
112 | 109 |
113 CreateFilterEngine(); | 110 CreateFilterEngine(); |
114 ForceUpdateCheck(); | 111 ForceUpdateCheck(); |
115 | 112 |
116 auto requestUrl = ProcessPendingUpdateWebRequest(); | 113 auto requestUrl = ProcessPendingUpdateWebRequest(); |
117 | 114 |
118 ASSERT_FALSE(eventCallbackCalled); | 115 ASSERT_FALSE(eventCallbackCalled); |
119 ASSERT_TRUE(updateCallbackCalled); | 116 ASSERT_TRUE(updateCallbackCalled); |
120 ASSERT_FALSE(updateError.empty()); | 117 ASSERT_FALSE(updateError.empty()); |
121 | 118 |
122 std::string expectedUrl(filterEngine->GetPref("update_url_release").AsString()
); | 119 std::string expectedUrl(platform->GetFilterEngine().GetPref("update_url_releas
e").AsString()); |
123 std::string platform = GetJsEngine().Evaluate("require('info').platform").AsSt
ring(); | 120 std::string platform = GetJsEngine().Evaluate("require('info').platform").AsSt
ring(); |
124 std::string platformVersion = GetJsEngine().Evaluate("require('info').platform
Version").AsString(); | 121 std::string platformVersion = GetJsEngine().Evaluate("require('info').platform
Version").AsString(); |
125 | 122 |
126 FindAndReplace(expectedUrl, "%NAME%", appInfo.name); | 123 FindAndReplace(expectedUrl, "%NAME%", appInfo.name); |
127 FindAndReplace(expectedUrl, "%TYPE%", "1"); // manual update | 124 FindAndReplace(expectedUrl, "%TYPE%", "1"); // manual update |
128 expectedUrl += "&addonName=" + appInfo.name + | 125 expectedUrl += "&addonName=" + appInfo.name + |
129 "&addonVersion=" + appInfo.version + | 126 "&addonVersion=" + appInfo.version + |
130 "&application=" + appInfo.application + | 127 "&application=" + appInfo.application + |
131 "&applicationVersion=" + appInfo.applicationVersion + | 128 "&applicationVersion=" + appInfo.applicationVersion + |
132 "&platform=" + platform + | 129 "&platform=" + platform + |
(...skipping 18 matching lines...) Expand all Loading... |
151 ForceUpdateCheck(); | 148 ForceUpdateCheck(); |
152 | 149 |
153 auto requestUrl = ProcessPendingUpdateWebRequest(); | 150 auto requestUrl = ProcessPendingUpdateWebRequest(); |
154 | 151 |
155 ASSERT_TRUE(eventCallbackCalled); | 152 ASSERT_TRUE(eventCallbackCalled); |
156 ASSERT_EQ(1u, eventCallbackParams.size()); | 153 ASSERT_EQ(1u, eventCallbackParams.size()); |
157 ASSERT_EQ("https://foo.bar/", eventCallbackParams[0].AsString()); | 154 ASSERT_EQ("https://foo.bar/", eventCallbackParams[0].AsString()); |
158 ASSERT_TRUE(updateCallbackCalled); | 155 ASSERT_TRUE(updateCallbackCalled); |
159 ASSERT_TRUE(updateError.empty()); | 156 ASSERT_TRUE(updateError.empty()); |
160 | 157 |
161 std::string expectedUrl(filterEngine->GetPref("update_url_devbuild").AsString(
)); | 158 std::string expectedUrl(platform->GetFilterEngine().GetPref("update_url_devbui
ld").AsString()); |
162 std::string platform = GetJsEngine().Evaluate("require('info').platform").AsSt
ring(); | 159 std::string platform = GetJsEngine().Evaluate("require('info').platform").AsSt
ring(); |
163 std::string platformVersion = GetJsEngine().Evaluate("require('info').platform
Version").AsString(); | 160 std::string platformVersion = GetJsEngine().Evaluate("require('info').platform
Version").AsString(); |
164 | 161 |
165 FindAndReplace(expectedUrl, "%NAME%", appInfo.name); | 162 FindAndReplace(expectedUrl, "%NAME%", appInfo.name); |
166 FindAndReplace(expectedUrl, "%TYPE%", "1"); // manual update | 163 FindAndReplace(expectedUrl, "%TYPE%", "1"); // manual update |
167 expectedUrl += "&addonName=" + appInfo.name + | 164 expectedUrl += "&addonName=" + appInfo.name + |
168 "&addonVersion=" + appInfo.version + | 165 "&addonVersion=" + appInfo.version + |
169 "&application=" + appInfo.application + | 166 "&application=" + appInfo.application + |
170 "&applicationVersion=" + appInfo.applicationVersion + | 167 "&applicationVersion=" + appInfo.applicationVersion + |
171 "&platform=" + platform + | 168 "&platform=" + platform + |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 \"version\": \"1.0.2\",\ | 270 \"version\": \"1.0.2\",\ |
274 \"url\": \"https://downloads.adblockplus.org/test-1.0.2.tar.gz?update\"\ | 271 \"url\": \"https://downloads.adblockplus.org/test-1.0.2.tar.gz?update\"\ |
275 }\ | 272 }\ |
276 }"; | 273 }"; |
277 | 274 |
278 appInfo.name = "test"; | 275 appInfo.name = "test"; |
279 appInfo.version = "1.0.1"; | 276 appInfo.version = "1.0.1"; |
280 CreateFilterEngine(); | 277 CreateFilterEngine(); |
281 | 278 |
282 int timesCalled = 0; | 279 int timesCalled = 0; |
283 filterEngine->SetUpdateAvailableCallback([×Called](const std::string&)->v
oid | 280 platform->GetFilterEngine().SetUpdateAvailableCallback([×Called](const st
d::string&)->void |
284 { | 281 { |
285 ++timesCalled; | 282 ++timesCalled; |
286 }); | 283 }); |
287 ForceUpdateCheck(); | 284 ForceUpdateCheck(); |
288 | 285 |
289 // ensure that the was the corresponding request | 286 // ensure that the was the corresponding request |
290 EXPECT_FALSE(ProcessPendingUpdateWebRequest().empty()); | 287 EXPECT_FALSE(ProcessPendingUpdateWebRequest().empty()); |
291 | 288 |
292 EXPECT_EQ(1, timesCalled); | 289 EXPECT_EQ(1, timesCalled); |
293 | 290 |
294 // filterEngine->SetUpdateAvailableCallback overriddes previously installed on
JsEngine | 291 // FilterEngine::SetUpdateAvailableCallback overriddes previously installed on
JsEngine |
295 // handler for "updateAvailable" event. | 292 // handler for "updateAvailable" event. |
296 EXPECT_FALSE(eventCallbackCalled); | 293 EXPECT_FALSE(eventCallbackCalled); |
297 | 294 |
298 filterEngine->RemoveUpdateAvailableCallback(); | 295 platform->GetFilterEngine().RemoveUpdateAvailableCallback(); |
299 ForceUpdateCheck(); | 296 ForceUpdateCheck(); |
300 | 297 |
301 // ensure that the was the corresponding request | 298 // ensure that the was the corresponding request |
302 EXPECT_FALSE(ProcessPendingUpdateWebRequest().empty()); | 299 EXPECT_FALSE(ProcessPendingUpdateWebRequest().empty()); |
303 | 300 |
304 EXPECT_FALSE(eventCallbackCalled); | 301 EXPECT_FALSE(eventCallbackCalled); |
305 EXPECT_EQ(1, timesCalled); | 302 EXPECT_EQ(1, timesCalled); |
306 | 303 |
307 // previous handler is not restored | 304 // previous handler is not restored |
308 EXPECT_FALSE(eventCallbackCalled); | 305 EXPECT_FALSE(eventCallbackCalled); |
309 } | 306 } |
OLD | NEW |