| 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 | 
|---|