| 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 "BaseJsTest.h" | 18 #include "BaseJsTest.h" |
| 19 #include <AdblockPlus/DefaultLogSystem.h> |
| 19 #include <thread> | 20 #include <thread> |
| 20 #include <condition_variable> | 21 #include <condition_variable> |
| 21 | 22 |
| 22 using namespace AdblockPlus; | 23 using namespace AdblockPlus; |
| 23 | 24 |
| 24 namespace AdblockPlus | 25 namespace AdblockPlus |
| 25 { | 26 { |
| 26 namespace Utils | 27 namespace Utils |
| 27 { | 28 { |
| 28 inline bool BeginsWith(const std::string& str, const std::string& beginning) | 29 inline bool BeginsWith(const std::string& str, const std::string& beginning) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 43 { | 44 { |
| 44 callback(StatResult(), ""); | 45 callback(StatResult(), ""); |
| 45 }); | 46 }); |
| 46 } | 47 } |
| 47 }; | 48 }; |
| 48 | 49 |
| 49 template<class LazyFileSystemT, class LogSystem> | 50 template<class LazyFileSystemT, class LogSystem> |
| 50 class FilterEngineTestGeneric : public ::testing::Test | 51 class FilterEngineTestGeneric : public ::testing::Test |
| 51 { | 52 { |
| 52 protected: | 53 protected: |
| 54 std::unique_ptr<Platform> platform; |
| 53 FilterEnginePtr filterEngine; | 55 FilterEnginePtr filterEngine; |
| 54 | 56 |
| 55 void SetUp() override | 57 void SetUp() override |
| 56 { | 58 { |
| 57 LazyFileSystemT* fileSystem; | 59 LazyFileSystemT* fileSystem; |
| 58 JsEngineCreationParameters jsEngineParams; | 60 ThrowingPlatformCreationParameters platformParams; |
| 59 jsEngineParams.fileSystem.reset(fileSystem = new LazyFileSystemT()); | 61 platformParams.logSystem.reset(new LogSystem()); |
| 60 jsEngineParams.logSystem.reset(new LogSystem()); | 62 platformParams.timer.reset(new NoopTimer()); |
| 61 jsEngineParams.timer.reset(new NoopTimer()); | 63 platformParams.fileSystem.reset(fileSystem = new LazyFileSystemT()); |
| 62 jsEngineParams.webRequest.reset(new NoopWebRequest()); | 64 platformParams.webRequest.reset(new NoopWebRequest()); |
| 63 auto jsEngine = CreateJsEngine(std::move(jsEngineParams)); | 65 platform.reset(new Platform(std::move(platformParams))); |
| 64 filterEngine = CreateFilterEngine(*fileSystem, jsEngine); | 66 filterEngine = CreateFilterEngine(*fileSystem, platform->GetJsEngine()); |
| 65 } | 67 } |
| 66 }; | 68 }; |
| 67 | 69 |
| 68 typedef FilterEngineTestGeneric<LazyFileSystem, AdblockPlus::DefaultLogSystem>
FilterEngineTest; | 70 typedef FilterEngineTestGeneric<LazyFileSystem, AdblockPlus::DefaultLogSystem>
FilterEngineTest; |
| 69 typedef FilterEngineTestGeneric<NoFilesFileSystem, LazyLogSystem> FilterEngine
TestNoData; | 71 typedef FilterEngineTestGeneric<NoFilesFileSystem, LazyLogSystem> FilterEngine
TestNoData; |
| 70 | 72 |
| 71 class FilterEngineWithFreshFolder : public ::testing::Test | 73 class FilterEngineWithFreshFolder : public ::testing::Test |
| 72 { | 74 { |
| 73 protected: | 75 protected: |
| 76 std::unique_ptr<Platform> platform; |
| 74 FileSystemPtr fileSystem; | 77 FileSystemPtr fileSystem; |
| 75 std::list<SchedulerTask> fileSystemTasks; | 78 std::list<SchedulerTask> fileSystemTasks; |
| 76 std::weak_ptr<JsEngine> weakJsEngine; | 79 std::weak_ptr<JsEngine> weakJsEngine; |
| 77 | 80 |
| 78 void SetUp() override | 81 void SetUp() override |
| 79 { | 82 { |
| 80 fileSystem = CreateDefaultFileSystem([this](const SchedulerTask& task) | 83 fileSystem = CreateDefaultFileSystem([this](const SchedulerTask& task) |
| 81 { | 84 { |
| 82 fileSystemTasks.emplace_back(task); | 85 fileSystemTasks.emplace_back(task); |
| 83 }); | 86 }); |
| 84 // Since there is neither in memory FS nor functionality to work with | 87 // Since there is neither in memory FS nor functionality to work with |
| 85 // directories use the hack: manually clean the directory. | 88 // directories use the hack: manually clean the directory. |
| 86 removeFileIfExists("patterns.ini"); | 89 removeFileIfExists("patterns.ini"); |
| 87 removeFileIfExists("prefs.json"); | 90 removeFileIfExists("prefs.json"); |
| 88 } | 91 } |
| 89 JsEnginePtr CreateJsEngine(const AppInfo& appInfo = AppInfo()) | 92 JsEnginePtr CreateJsEngine(const AppInfo& appInfo = AppInfo()) |
| 90 { | 93 { |
| 91 JsEngineCreationParameters jsEngineParams; | 94 ThrowingPlatformCreationParameters platformParams; |
| 92 jsEngineParams.appInfo = appInfo; | 95 platformParams.logSystem.reset(new LazyLogSystem()); |
| 93 jsEngineParams.fileSystem = fileSystem; | 96 platformParams.timer.reset(new NoopTimer()); |
| 94 jsEngineParams.logSystem.reset(new LazyLogSystem()); | 97 platformParams.fileSystem = fileSystem; |
| 95 jsEngineParams.timer.reset(new NoopTimer()); | 98 platformParams.webRequest.reset(new NoopWebRequest()); |
| 96 jsEngineParams.webRequest.reset(new NoopWebRequest()); | 99 platform.reset(new Platform(std::move(platformParams))); |
| 97 auto jsEngine = ::CreateJsEngine(std::move(jsEngineParams)); | 100 platform->SetUpJsEngine(appInfo); |
| 101 auto jsEngine = platform->GetJsEngine(); |
| 98 weakJsEngine = jsEngine; | 102 weakJsEngine = jsEngine; |
| 99 return jsEngine; | 103 return jsEngine; |
| 100 } | 104 } |
| 101 | 105 |
| 102 FilterEnginePtr CreateFilterEngine(const JsEnginePtr& jsEngine, | 106 FilterEnginePtr CreateFilterEngine(const JsEnginePtr& jsEngine, |
| 103 const FilterEngine::CreationParameters& creationParams = FilterEngine::Cre
ationParameters()) | 107 const FilterEngine::CreationParameters& creationParams = FilterEngine::Cre
ationParameters()) |
| 104 { | 108 { |
| 105 FilterEnginePtr retValue; | 109 FilterEnginePtr retValue; |
| 106 FilterEngine::CreateAsync(jsEngine, [&retValue](const FilterEnginePtr& fil
terEngine) | 110 FilterEngine::CreateAsync(jsEngine, [&retValue](const FilterEnginePtr& fil
terEngine) |
| 107 { | 111 { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 class FilterEngineIsSubscriptionDownloadAllowedTest : public ::testing::Test | 161 class FilterEngineIsSubscriptionDownloadAllowedTest : public ::testing::Test |
| 158 { | 162 { |
| 159 protected: | 163 protected: |
| 160 typedef std::vector<std::pair<bool, std::string>> ConnectionTypes; | 164 typedef std::vector<std::pair<bool, std::string>> ConnectionTypes; |
| 161 DelayedWebRequest::SharedTasks webRequestTasks; | 165 DelayedWebRequest::SharedTasks webRequestTasks; |
| 162 DelayedTimer::SharedTasks timerTasks; | 166 DelayedTimer::SharedTasks timerTasks; |
| 163 FilterEngine::CreationParameters createParams; | 167 FilterEngine::CreationParameters createParams; |
| 164 ConnectionTypes capturedConnectionTypes; | 168 ConnectionTypes capturedConnectionTypes; |
| 165 bool isConnectionAllowed; | 169 bool isConnectionAllowed; |
| 166 std::vector<std::function<void(bool)>> isSubscriptionDownloadAllowedCallback
s; | 170 std::vector<std::function<void(bool)>> isSubscriptionDownloadAllowedCallback
s; |
| 171 std::unique_ptr<Platform> platform; |
| 167 FilterEnginePtr filterEngine; | 172 FilterEnginePtr filterEngine; |
| 168 JsEnginePtr jsEngine; | |
| 169 LazyFileSystem* fileSystem; | 173 LazyFileSystem* fileSystem; |
| 170 | 174 |
| 171 void SetUp() | 175 void SetUp() |
| 172 { | 176 { |
| 173 isConnectionAllowed = true; | 177 isConnectionAllowed = true; |
| 174 | 178 |
| 175 JsEngineCreationParameters jsEngineParams; | 179 ThrowingPlatformCreationParameters platformParams; |
| 176 jsEngineParams.logSystem.reset(new LazyLogSystem()); | 180 platformParams.logSystem.reset(new LazyLogSystem()); |
| 177 jsEngineParams.fileSystem.reset(fileSystem = new LazyFileSystem()); | 181 platformParams.timer = DelayedTimer::New(timerTasks); |
| 178 jsEngineParams.timer = DelayedTimer::New(timerTasks); | 182 platformParams.fileSystem.reset(fileSystem = new LazyFileSystem()); |
| 179 jsEngineParams.webRequest = DelayedWebRequest::New(webRequestTasks); | 183 platformParams.webRequest = DelayedWebRequest::New(webRequestTasks); |
| 180 jsEngine = CreateJsEngine(std::move(jsEngineParams)); | 184 platform.reset(new Platform(std::move(platformParams))); |
| 181 | 185 |
| 182 createParams.preconfiguredPrefs.emplace("first_run_subscription_auto_selec
t", jsEngine->NewValue(false)); | 186 createParams.preconfiguredPrefs.emplace("first_run_subscription_auto_selec
t", platform->GetJsEngine()->NewValue(false)); |
| 183 | 187 |
| 184 createParams.isSubscriptionDownloadAllowedCallback = [this](const std::str
ing* allowedConnectionType, | 188 createParams.isSubscriptionDownloadAllowedCallback = [this](const std::str
ing* allowedConnectionType, |
| 185 const std::function<void(bool)>& isSubscriptionDownloadAllowedCallback){ | 189 const std::function<void(bool)>& isSubscriptionDownloadAllowedCallback){ |
| 186 capturedConnectionTypes.emplace_back(!!allowedConnectionType, allowedCon
nectionType ? *allowedConnectionType : std::string()); | 190 capturedConnectionTypes.emplace_back(!!allowedConnectionType, allowedCon
nectionType ? *allowedConnectionType : std::string()); |
| 187 isSubscriptionDownloadAllowedCallbacks.emplace_back(isSubscriptionDownlo
adAllowedCallback); | 191 isSubscriptionDownloadAllowedCallbacks.emplace_back(isSubscriptionDownlo
adAllowedCallback); |
| 188 }; | 192 }; |
| 189 } | 193 } |
| 190 | 194 |
| 191 Subscription EnsureExampleSubscriptionAndForceUpdate(const std::string& appp
endToUrl = std::string()) | 195 Subscription EnsureExampleSubscriptionAndForceUpdate(const std::string& appp
endToUrl = std::string()) |
| 192 { | 196 { |
| 193 auto subscriptionUrl = "http://example" + apppendToUrl; | 197 auto subscriptionUrl = "http://example" + apppendToUrl; |
| 194 bool isSubscriptionDownloadStatusReceived = false; | 198 bool isSubscriptionDownloadStatusReceived = false; |
| 195 if (!filterEngine) | 199 if (!filterEngine) |
| 196 { | 200 { |
| 197 filterEngine = CreateFilterEngine(*fileSystem, jsEngine, createParams); | 201 filterEngine = CreateFilterEngine(*fileSystem, platform->GetJsEngine(),
createParams); |
| 198 filterEngine->SetFilterChangeCallback([&isSubscriptionDownloadStatusRece
ived, &subscriptionUrl](const std::string& action, JsValue&& item) | 202 filterEngine->SetFilterChangeCallback([&isSubscriptionDownloadStatusRece
ived, &subscriptionUrl](const std::string& action, JsValue&& item) |
| 199 { | 203 { |
| 200 if (action == "subscription.downloadStatus" && item.GetProperty("url")
.AsString() == subscriptionUrl) | 204 if (action == "subscription.downloadStatus" && item.GetProperty("url")
.AsString() == subscriptionUrl) |
| 201 isSubscriptionDownloadStatusReceived = true; | 205 isSubscriptionDownloadStatusReceived = true; |
| 202 }); | 206 }); |
| 203 } | 207 } |
| 204 auto subscription = filterEngine->GetSubscription(subscriptionUrl); | 208 auto subscription = filterEngine->GetSubscription(subscriptionUrl); |
| 205 EXPECT_EQ(0u, subscription.GetProperty("filters").AsList().size()) << subs
criptionUrl; | 209 EXPECT_EQ(0u, subscription.GetProperty("filters").AsList().size()) << subs
criptionUrl; |
| 206 EXPECT_TRUE(subscription.GetProperty("downloadStatus").IsNull()) << subscr
iptionUrl; | 210 EXPECT_TRUE(subscription.GetProperty("downloadStatus").IsNull()) << subscr
iptionUrl; |
| 207 subscription.UpdateFilters(); | 211 subscription.UpdateFilters(); |
| (...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 992 auto subscription = EnsureExampleSubscriptionAndForceUpdate(); | 996 auto subscription = EnsureExampleSubscriptionAndForceUpdate(); |
| 993 EXPECT_EQ("synchronize_connection_error", subscription.GetProperty("downloadSt
atus").AsString()); | 997 EXPECT_EQ("synchronize_connection_error", subscription.GetProperty("downloadSt
atus").AsString()); |
| 994 EXPECT_EQ(0u, subscription.GetProperty("filters").AsList().size()); | 998 EXPECT_EQ(0u, subscription.GetProperty("filters").AsList().size()); |
| 995 EXPECT_EQ(1u, capturedConnectionTypes.size()); | 999 EXPECT_EQ(1u, capturedConnectionTypes.size()); |
| 996 } | 1000 } |
| 997 | 1001 |
| 998 TEST_F(FilterEngineIsSubscriptionDownloadAllowedTest, PredefinedAllowedConnectio
nTypeIsPassedToCallback) | 1002 TEST_F(FilterEngineIsSubscriptionDownloadAllowedTest, PredefinedAllowedConnectio
nTypeIsPassedToCallback) |
| 999 { | 1003 { |
| 1000 std::string predefinedAllowedConnectionType = "non-metered"; | 1004 std::string predefinedAllowedConnectionType = "non-metered"; |
| 1001 createParams.preconfiguredPrefs.insert(std::make_pair("allowed_connection_type
", | 1005 createParams.preconfiguredPrefs.insert(std::make_pair("allowed_connection_type
", |
| 1002 jsEngine->NewValue(predefinedAllowedConnectionType))); | 1006 platform->GetJsEngine()->NewValue(predefinedAllowedConnectionType))); |
| 1003 auto subscription = EnsureExampleSubscriptionAndForceUpdate(); | 1007 auto subscription = EnsureExampleSubscriptionAndForceUpdate(); |
| 1004 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStrin
g()); | 1008 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStrin
g()); |
| 1005 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); | 1009 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); |
| 1006 ASSERT_EQ(1u, capturedConnectionTypes.size()); | 1010 ASSERT_EQ(1u, capturedConnectionTypes.size()); |
| 1007 EXPECT_TRUE(capturedConnectionTypes[0].first); | 1011 EXPECT_TRUE(capturedConnectionTypes[0].first); |
| 1008 EXPECT_EQ(predefinedAllowedConnectionType, capturedConnectionTypes[0].second); | 1012 EXPECT_EQ(predefinedAllowedConnectionType, capturedConnectionTypes[0].second); |
| 1009 } | 1013 } |
| 1010 | 1014 |
| 1011 TEST_F(FilterEngineIsSubscriptionDownloadAllowedTest, ConfiguredConnectionTypeIs
PassedToCallback) | 1015 TEST_F(FilterEngineIsSubscriptionDownloadAllowedTest, ConfiguredConnectionTypeIs
PassedToCallback) |
| 1012 { | 1016 { |
| 1013 // FilterEngine->RemoveSubscription is not usable here because subscriptions | 1017 // FilterEngine->RemoveSubscription is not usable here because subscriptions |
| 1014 // are cached internally by URL. So, different URLs are used in diffirent | 1018 // are cached internally by URL. So, different URLs are used in diffirent |
| 1015 // checks. | 1019 // checks. |
| 1016 { | 1020 { |
| 1017 std::string predefinedAllowedConnectionType = "non-metered"; | 1021 std::string predefinedAllowedConnectionType = "non-metered"; |
| 1018 createParams.preconfiguredPrefs.insert(std::make_pair( | 1022 createParams.preconfiguredPrefs.insert(std::make_pair( |
| 1019 "allowed_connection_type", jsEngine->NewValue(predefinedAllowedConnectionT
ype))); | 1023 "allowed_connection_type", platform->GetJsEngine()->NewValue(predefinedAll
owedConnectionType))); |
| 1020 auto subscription = EnsureExampleSubscriptionAndForceUpdate(); | 1024 auto subscription = EnsureExampleSubscriptionAndForceUpdate(); |
| 1021 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStr
ing()); | 1025 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStr
ing()); |
| 1022 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); | 1026 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); |
| 1023 ASSERT_EQ(1u, capturedConnectionTypes.size()); | 1027 ASSERT_EQ(1u, capturedConnectionTypes.size()); |
| 1024 EXPECT_TRUE(capturedConnectionTypes[0].first); | 1028 EXPECT_TRUE(capturedConnectionTypes[0].first); |
| 1025 EXPECT_EQ(predefinedAllowedConnectionType, capturedConnectionTypes[0].second
); | 1029 EXPECT_EQ(predefinedAllowedConnectionType, capturedConnectionTypes[0].second
); |
| 1026 } | 1030 } |
| 1027 capturedConnectionTypes.clear(); | 1031 capturedConnectionTypes.clear(); |
| 1028 { | 1032 { |
| 1029 // set no value | 1033 // set no value |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1041 std::string testConnection = "test connection"; | 1045 std::string testConnection = "test connection"; |
| 1042 filterEngine->SetAllowedConnectionType(&testConnection); | 1046 filterEngine->SetAllowedConnectionType(&testConnection); |
| 1043 auto subscription = EnsureExampleSubscriptionAndForceUpdate("subB"); | 1047 auto subscription = EnsureExampleSubscriptionAndForceUpdate("subB"); |
| 1044 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStr
ing()); | 1048 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStr
ing()); |
| 1045 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); | 1049 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); |
| 1046 ASSERT_EQ(1u, capturedConnectionTypes.size()); | 1050 ASSERT_EQ(1u, capturedConnectionTypes.size()); |
| 1047 EXPECT_TRUE(capturedConnectionTypes[0].first); | 1051 EXPECT_TRUE(capturedConnectionTypes[0].first); |
| 1048 EXPECT_EQ(testConnection, capturedConnectionTypes[0].second); | 1052 EXPECT_EQ(testConnection, capturedConnectionTypes[0].second); |
| 1049 } | 1053 } |
| 1050 } | 1054 } |
| OLD | NEW |