| 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 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 strings.clear(); | 189 strings.clear(); |
| 190 } | 190 } |
| 191 private: | 191 private: |
| 192 mutable std::mutex mutex; | 192 mutable std::mutex mutex; |
| 193 std::vector<std::pair<bool, std::string>> strings; | 193 std::vector<std::pair<bool, std::string>> strings; |
| 194 }; | 194 }; |
| 195 protected: | 195 protected: |
| 196 MockWebRequest* webRequest; | 196 MockWebRequest* webRequest; |
| 197 std::string subscriptionUrlPrefix; | 197 std::string subscriptionUrlPrefix; |
| 198 FilterEngine::CreationParameters createParams; | 198 FilterEngine::CreationParameters createParams; |
| 199 SyncStrings capturedConnectionTypes; | 199 // HACK: it's a shared pointer to keep it available in |
| 200 bool isConnectionAllowed; | 200 // isConnectionAllowedCallback after destroying of the test. |
| 201 struct SharedData |
| 202 { |
| 203 SyncStrings capturedConnectionTypes; |
| 204 bool isConnectionAllowed; |
| 205 struct |
| 206 { |
| 207 std::string url; |
| 208 std::mutex mutex; |
| 209 std::condition_variable cv; |
| 210 } downloadStatusChanged; |
| 211 }; |
| 212 std::shared_ptr<SharedData> data; |
| 201 FilterEnginePtr filterEngine; | 213 FilterEnginePtr filterEngine; |
| 202 | 214 |
| 203 struct | |
| 204 { | |
| 205 std::string url; | |
| 206 std::mutex mutex; | |
| 207 std::condition_variable cv; | |
| 208 } downloadStatusChanged; | |
| 209 | |
| 210 void SetUp() | 215 void SetUp() |
| 211 { | 216 { |
| 217 data = std::make_shared<SharedData>(); |
| 212 BaseJsTest::SetUp(); | 218 BaseJsTest::SetUp(); |
| 213 jsEngine->SetFileSystem(AdblockPlus::FileSystemPtr(new LazyFileSystem())); | 219 jsEngine->SetFileSystem(AdblockPlus::FileSystemPtr(new LazyFileSystem())); |
| 214 jsEngine->SetWebRequest(AdblockPlus::WebRequestPtr(webRequest = new MockWe
bRequest())); | 220 jsEngine->SetWebRequest(AdblockPlus::WebRequestPtr(webRequest = new MockWe
bRequest())); |
| 215 jsEngine->SetLogSystem(AdblockPlus::LogSystemPtr(new LazyLogSystem())); | 221 jsEngine->SetLogSystem(AdblockPlus::LogSystemPtr(new LazyLogSystem())); |
| 216 | 222 |
| 217 subscriptionUrlPrefix = "http://example"; | 223 subscriptionUrlPrefix = "http://example"; |
| 218 ServerResponse exampleSubscriptionResponse; | 224 ServerResponse exampleSubscriptionResponse; |
| 219 exampleSubscriptionResponse.responseStatus = 200; | 225 exampleSubscriptionResponse.responseStatus = 200; |
| 220 exampleSubscriptionResponse.status = WebRequest::NS_OK; | 226 exampleSubscriptionResponse.status = WebRequest::NS_OK; |
| 221 exampleSubscriptionResponse.responseText = "[Adblock Plus 2.0]\n||example.
com"; | 227 exampleSubscriptionResponse.responseText = "[Adblock Plus 2.0]\n||example.
com"; |
| 222 webRequest->responses.emplace(subscriptionUrlPrefix, exampleSubscriptionRe
sponse); | 228 webRequest->responses.emplace(subscriptionUrlPrefix, exampleSubscriptionRe
sponse); |
| 223 createParams.preconfiguredPrefs.emplace("first_run_subscription_auto_selec
t", jsEngine->NewValue(false)); | 229 createParams.preconfiguredPrefs.emplace("first_run_subscription_auto_selec
t", jsEngine->NewValue(false)); |
| 224 isConnectionAllowed = true; | 230 data->isConnectionAllowed = true; |
| 225 createParams.isConnectionAllowedCallback = [this](const std::string* allow
edConnectionType)->bool{ | 231 auto closure = data; |
| 226 capturedConnectionTypes.Add(allowedConnectionType); | 232 createParams.isConnectionAllowedCallback = [closure](const std::string* al
lowedConnectionType)->bool{ |
| 227 return isConnectionAllowed; | 233 closure->capturedConnectionTypes.Add(allowedConnectionType); |
| 234 return closure->isConnectionAllowed; |
| 228 }; | 235 }; |
| 229 jsEngine->SetEventCallback("filterChange", [this](JsValueList&& params/*ac
tion, item*/) | |
| 230 { | |
| 231 ASSERT_EQ(2u, params.size()); | |
| 232 if (params[0].AsString() == "subscription.downloadStatus") | |
| 233 { | |
| 234 { | |
| 235 std::lock_guard<std::mutex> lock(downloadStatusChanged.mutex); | |
| 236 downloadStatusChanged.url = params[1].GetProperty("url").AsString(); | |
| 237 } | |
| 238 downloadStatusChanged.cv.notify_one(); | |
| 239 } | |
| 240 }); | |
| 241 } | 236 } |
| 242 | 237 |
| 243 Subscription EnsureExampleSubscriptionAndForceUpdate(const std::string& appp
endToUrl = std::string()) | 238 Subscription EnsureExampleSubscriptionAndForceUpdate(const std::string& appp
endToUrl = std::string()) |
| 244 { | 239 { |
| 245 if (!filterEngine) | 240 if (!filterEngine) |
| 241 { |
| 246 filterEngine = FilterEngine::Create(jsEngine, createParams); | 242 filterEngine = FilterEngine::Create(jsEngine, createParams); |
| 243 auto closure = data; |
| 244 filterEngine->SetFilterChangeCallback([closure](const std::string& actio
n, JsValue&& item) |
| 245 { |
| 246 if (action == "subscription.downloadStatus") |
| 247 { |
| 248 { |
| 249 std::lock_guard<std::mutex> lock(closure->downloadStatusChanged.mu
tex); |
| 250 closure->downloadStatusChanged.url = item.GetProperty("url").AsStr
ing(); |
| 251 } |
| 252 closure->downloadStatusChanged.cv.notify_one(); |
| 253 } |
| 254 }); |
| 255 } |
| 247 auto subscriptionUrl = subscriptionUrlPrefix + apppendToUrl; | 256 auto subscriptionUrl = subscriptionUrlPrefix + apppendToUrl; |
| 248 auto subscription = filterEngine->GetSubscription(subscriptionUrl); | 257 auto subscription = filterEngine->GetSubscription(subscriptionUrl); |
| 249 EXPECT_EQ(0u, subscription.GetProperty("filters").AsList().size()) << subs
criptionUrl; | 258 EXPECT_EQ(0u, subscription.GetProperty("filters").AsList().size()) << subs
criptionUrl; |
| 250 EXPECT_TRUE(subscription.GetProperty("downloadStatus").IsNull()) << subscr
iptionUrl; | 259 EXPECT_TRUE(subscription.GetProperty("downloadStatus").IsNull()) << subscr
iptionUrl; |
| 251 subscription.UpdateFilters(); | 260 subscription.UpdateFilters(); |
| 252 { | 261 { |
| 253 std::unique_lock<std::mutex> lock(downloadStatusChanged.mutex); | 262 std::unique_lock<std::mutex> lock(data->downloadStatusChanged.mutex); |
| 254 downloadStatusChanged.cv.wait_for(lock, | 263 data->downloadStatusChanged.cv.wait_for(lock, |
| 255 /*don't block tests forever*/std::chrono::seconds(5), | 264 /*don't block tests forever*/std::chrono::seconds(300), |
| 256 [this, subscriptionUrl]()->bool | 265 [this, subscriptionUrl]()->bool |
| 257 { | 266 { |
| 258 return subscriptionUrl == downloadStatusChanged.url; | 267 return subscriptionUrl == data->downloadStatusChanged.url; |
| 259 }); | 268 }); |
| 260 // Basically it's enough to wait only for downloadStatus although there | 269 // Basically it's enough to wait only for downloadStatus although there |
| 261 // is still some JS code being executed. Any following attempt to work | 270 // is still some JS code being executed. Any following attempt to work |
| 262 // with subscription object will result in execution of JS, which will | 271 // with subscription object will result in execution of JS, which will |
| 263 // be blocked until finishing of currently running code. | 272 // be blocked until finishing of currently running code. |
| 264 } | 273 } |
| 265 return subscription; | 274 return subscription; |
| 266 } | 275 } |
| 267 }; | 276 }; |
| 268 } | 277 } |
| (...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1049 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStrin
g()); | 1058 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStrin
g()); |
| 1050 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); | 1059 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); |
| 1051 } | 1060 } |
| 1052 | 1061 |
| 1053 TEST_F(FilterEngineIsAllowedConnectionTest, AllowingCallbackAllowsUpdating) | 1062 TEST_F(FilterEngineIsAllowedConnectionTest, AllowingCallbackAllowsUpdating) |
| 1054 { | 1063 { |
| 1055 // no stored allowed_connection_type preference | 1064 // no stored allowed_connection_type preference |
| 1056 auto subscription = EnsureExampleSubscriptionAndForceUpdate(); | 1065 auto subscription = EnsureExampleSubscriptionAndForceUpdate(); |
| 1057 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStrin
g()); | 1066 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStrin
g()); |
| 1058 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); | 1067 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); |
| 1059 auto capturedConnectionTypes = this->capturedConnectionTypes.GetStrings(); | 1068 auto capturedConnectionTypes = data->capturedConnectionTypes.GetStrings(); |
| 1060 ASSERT_EQ(1u, capturedConnectionTypes.size()); | 1069 ASSERT_EQ(1u, capturedConnectionTypes.size()); |
| 1061 EXPECT_FALSE(capturedConnectionTypes[0].first); | 1070 EXPECT_FALSE(capturedConnectionTypes[0].first); |
| 1062 } | 1071 } |
| 1063 | 1072 |
| 1064 TEST_F(FilterEngineIsAllowedConnectionTest, NotAllowingCallbackDoesNotAllowUpdat
ing) | 1073 TEST_F(FilterEngineIsAllowedConnectionTest, NotAllowingCallbackDoesNotAllowUpdat
ing) |
| 1065 { | 1074 { |
| 1066 isConnectionAllowed = false; | 1075 data->isConnectionAllowed = false; |
| 1067 // no stored allowed_connection_type preference | 1076 // no stored allowed_connection_type preference |
| 1068 auto subscription = EnsureExampleSubscriptionAndForceUpdate(); | 1077 auto subscription = EnsureExampleSubscriptionAndForceUpdate(); |
| 1069 EXPECT_EQ("synchronize_connection_error", subscription.GetProperty("downloadSt
atus").AsString()); | 1078 EXPECT_EQ("synchronize_connection_error", subscription.GetProperty("downloadSt
atus").AsString()); |
| 1070 EXPECT_EQ(0u, subscription.GetProperty("filters").AsList().size()); | 1079 EXPECT_EQ(0u, subscription.GetProperty("filters").AsList().size()); |
| 1071 auto capturedConnectionTypes = this->capturedConnectionTypes.GetStrings(); | 1080 auto capturedConnectionTypes = data->capturedConnectionTypes.GetStrings(); |
| 1072 EXPECT_EQ(1u, capturedConnectionTypes.size()); | 1081 EXPECT_EQ(1u, capturedConnectionTypes.size()); |
| 1073 } | 1082 } |
| 1074 | 1083 |
| 1075 TEST_F(FilterEngineIsAllowedConnectionTest, PredefinedAllowedConnectionTypeIsPas
sedToCallback) | 1084 TEST_F(FilterEngineIsAllowedConnectionTest, PredefinedAllowedConnectionTypeIsPas
sedToCallback) |
| 1076 { | 1085 { |
| 1077 std::string predefinedAllowedConnectionType = "non-metered"; | 1086 std::string predefinedAllowedConnectionType = "non-metered"; |
| 1078 createParams.preconfiguredPrefs.insert(std::make_pair("allowed_connection_type
", | 1087 createParams.preconfiguredPrefs.insert(std::make_pair("allowed_connection_type
", |
| 1079 jsEngine->NewValue(predefinedAllowedConnectionType))); | 1088 jsEngine->NewValue(predefinedAllowedConnectionType))); |
| 1080 auto subscription = EnsureExampleSubscriptionAndForceUpdate(); | 1089 auto subscription = EnsureExampleSubscriptionAndForceUpdate(); |
| 1081 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStrin
g()); | 1090 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStrin
g()); |
| 1082 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); | 1091 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); |
| 1083 auto capturedConnectionTypes = this->capturedConnectionTypes.GetStrings(); | 1092 auto capturedConnectionTypes = data->capturedConnectionTypes.GetStrings(); |
| 1084 ASSERT_EQ(1u, capturedConnectionTypes.size()); | 1093 ASSERT_EQ(1u, capturedConnectionTypes.size()); |
| 1085 EXPECT_TRUE(capturedConnectionTypes[0].first); | 1094 EXPECT_TRUE(capturedConnectionTypes[0].first); |
| 1086 EXPECT_EQ(predefinedAllowedConnectionType, capturedConnectionTypes[0].second); | 1095 EXPECT_EQ(predefinedAllowedConnectionType, capturedConnectionTypes[0].second); |
| 1087 } | 1096 } |
| 1088 | 1097 |
| 1089 TEST_F(FilterEngineIsAllowedConnectionTest, ConfiguredConnectionTypeIsPassedToCa
llback) | 1098 TEST_F(FilterEngineIsAllowedConnectionTest, ConfiguredConnectionTypeIsPassedToCa
llback) |
| 1090 { | 1099 { |
| 1091 // FilterEngine->RemoveSubscription is not usable here because subscriptions | 1100 // FilterEngine->RemoveSubscription is not usable here because subscriptions |
| 1092 // are cached internally by URL. So, different URLs are used in diffirent | 1101 // are cached internally by URL. So, different URLs are used in diffirent |
| 1093 // checks. | 1102 // checks. |
| 1094 { | 1103 { |
| 1095 std::string predefinedAllowedConnectionType = "non-metered"; | 1104 std::string predefinedAllowedConnectionType = "non-metered"; |
| 1096 createParams.preconfiguredPrefs.insert(std::make_pair( | 1105 createParams.preconfiguredPrefs.insert(std::make_pair( |
| 1097 "allowed_connection_type", jsEngine->NewValue(predefinedAllowedConnectionT
ype))); | 1106 "allowed_connection_type", jsEngine->NewValue(predefinedAllowedConnectionT
ype))); |
| 1098 auto subscription = EnsureExampleSubscriptionAndForceUpdate(); | 1107 auto subscription = EnsureExampleSubscriptionAndForceUpdate(); |
| 1099 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStr
ing()); | 1108 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStr
ing()); |
| 1100 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); | 1109 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); |
| 1101 auto capturedConnectionTypes = this->capturedConnectionTypes.GetStrings(); | 1110 auto capturedConnectionTypes = data->capturedConnectionTypes.GetStrings(); |
| 1102 ASSERT_EQ(1u, capturedConnectionTypes.size()); | 1111 ASSERT_EQ(1u, capturedConnectionTypes.size()); |
| 1103 EXPECT_TRUE(capturedConnectionTypes[0].first); | 1112 EXPECT_TRUE(capturedConnectionTypes[0].first); |
| 1104 EXPECT_EQ(predefinedAllowedConnectionType, capturedConnectionTypes[0].second
); | 1113 EXPECT_EQ(predefinedAllowedConnectionType, capturedConnectionTypes[0].second
); |
| 1105 } | 1114 } |
| 1106 capturedConnectionTypes.Clear(); | 1115 data->capturedConnectionTypes.Clear(); |
| 1107 { | 1116 { |
| 1108 // set no value | 1117 // set no value |
| 1109 filterEngine->SetAllowedConnectionType(nullptr); | 1118 filterEngine->SetAllowedConnectionType(nullptr); |
| 1110 auto subscription = EnsureExampleSubscriptionAndForceUpdate("subA"); | 1119 auto subscription = EnsureExampleSubscriptionAndForceUpdate("subA"); |
| 1111 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStr
ing()); | 1120 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStr
ing()); |
| 1112 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); | 1121 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); |
| 1113 auto capturedConnectionTypes = this->capturedConnectionTypes.GetStrings(); | 1122 auto capturedConnectionTypes = data->capturedConnectionTypes.GetStrings(); |
| 1114 ASSERT_EQ(1u, capturedConnectionTypes.size()); | 1123 ASSERT_EQ(1u, capturedConnectionTypes.size()); |
| 1115 EXPECT_FALSE(capturedConnectionTypes[0].first); | 1124 EXPECT_FALSE(capturedConnectionTypes[0].first); |
| 1116 subscription.RemoveFromList(); | 1125 subscription.RemoveFromList(); |
| 1117 this->capturedConnectionTypes.Clear(); | 1126 data->capturedConnectionTypes.Clear(); |
| 1118 } | 1127 } |
| 1119 capturedConnectionTypes.Clear(); | 1128 data->capturedConnectionTypes.Clear(); |
| 1120 { | 1129 { |
| 1121 // set some value | 1130 // set some value |
| 1122 std::string testConnection = "test connection"; | 1131 std::string testConnection = "test connection"; |
| 1123 filterEngine->SetAllowedConnectionType(&testConnection); | 1132 filterEngine->SetAllowedConnectionType(&testConnection); |
| 1124 auto subscription = EnsureExampleSubscriptionAndForceUpdate("subB"); | 1133 auto subscription = EnsureExampleSubscriptionAndForceUpdate("subB"); |
| 1125 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStr
ing()); | 1134 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStr
ing()); |
| 1126 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); | 1135 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); |
| 1127 auto capturedConnectionTypes = this->capturedConnectionTypes.GetStrings(); | 1136 auto capturedConnectionTypes = data->capturedConnectionTypes.GetStrings(); |
| 1128 ASSERT_EQ(1u, capturedConnectionTypes.size()); | 1137 ASSERT_EQ(1u, capturedConnectionTypes.size()); |
| 1129 EXPECT_TRUE(capturedConnectionTypes[0].first); | 1138 EXPECT_TRUE(capturedConnectionTypes[0].first); |
| 1130 EXPECT_EQ(testConnection, capturedConnectionTypes[0].second); | 1139 EXPECT_EQ(testConnection, capturedConnectionTypes[0].second); |
| 1131 } | 1140 } |
| 1132 } | 1141 } |
| OLD | NEW |