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 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 } | 65 } |
66 }; | 66 }; |
67 | 67 |
68 typedef FilterEngineTestGeneric<LazyFileSystem, AdblockPlus::DefaultLogSystem>
FilterEngineTest; | 68 typedef FilterEngineTestGeneric<LazyFileSystem, AdblockPlus::DefaultLogSystem>
FilterEngineTest; |
69 typedef FilterEngineTestGeneric<NoFilesFileSystem, LazyLogSystem> FilterEngine
TestNoData; | 69 typedef FilterEngineTestGeneric<NoFilesFileSystem, LazyLogSystem> FilterEngine
TestNoData; |
70 | 70 |
71 class FilterEngineWithFreshFolder : public ::testing::Test | 71 class FilterEngineWithFreshFolder : public ::testing::Test |
72 { | 72 { |
73 protected: | 73 protected: |
74 FileSystemPtr fileSystem; | 74 FileSystemPtr fileSystem; |
| 75 std::list<SchedulerTask> fileSystemTasks; |
75 std::weak_ptr<JsEngine> weakJsEngine; | 76 std::weak_ptr<JsEngine> weakJsEngine; |
76 | 77 |
77 void SetUp() override | 78 void SetUp() override |
78 { | 79 { |
79 fileSystem = CreateDefaultFileSystem(); | 80 fileSystem = CreateDefaultFileSystem([this](const SchedulerTask& task) |
| 81 { |
| 82 fileSystemTasks.emplace_back(task); |
| 83 }); |
80 // Since there is neither in memory FS nor functionality to work with | 84 // Since there is neither in memory FS nor functionality to work with |
81 // directories use the hack: manually clean the directory. | 85 // directories use the hack: manually clean the directory. |
82 removeFileIfExists("patterns.ini"); | 86 removeFileIfExists("patterns.ini"); |
83 removeFileIfExists("prefs.json"); | 87 removeFileIfExists("prefs.json"); |
84 } | 88 } |
85 JsEnginePtr createJsEngine(const AppInfo& appInfo = AppInfo()) | 89 JsEnginePtr CreateJsEngine(const AppInfo& appInfo = AppInfo()) |
86 { | 90 { |
87 JsEngineCreationParameters jsEngineParams; | 91 JsEngineCreationParameters jsEngineParams; |
88 jsEngineParams.appInfo = appInfo; | 92 jsEngineParams.appInfo = appInfo; |
89 jsEngineParams.fileSystem = fileSystem; | 93 jsEngineParams.fileSystem = fileSystem; |
90 jsEngineParams.logSystem.reset(new LazyLogSystem()); | 94 jsEngineParams.logSystem.reset(new LazyLogSystem()); |
91 jsEngineParams.timer.reset(new NoopTimer()); | 95 jsEngineParams.timer.reset(new NoopTimer()); |
92 jsEngineParams.webRequest.reset(new NoopWebRequest()); | 96 jsEngineParams.webRequest.reset(new NoopWebRequest()); |
93 auto jsEngine = CreateJsEngine(std::move(jsEngineParams)); | 97 auto jsEngine = ::CreateJsEngine(std::move(jsEngineParams)); |
94 weakJsEngine = jsEngine; | 98 weakJsEngine = jsEngine; |
95 return jsEngine; | 99 return jsEngine; |
96 } | 100 } |
| 101 |
| 102 FilterEnginePtr CreateFilterEngine(const JsEnginePtr& jsEngine, |
| 103 const FilterEngine::CreationParameters& creationParams = FilterEngine::Cre
ationParameters()) |
| 104 { |
| 105 FilterEnginePtr retValue; |
| 106 FilterEngine::CreateAsync(jsEngine, [&retValue](const FilterEnginePtr& fil
terEngine) |
| 107 { |
| 108 retValue = filterEngine; |
| 109 }, creationParams); |
| 110 while (!retValue && !fileSystemTasks.empty()) |
| 111 { |
| 112 (*fileSystemTasks.begin())(); |
| 113 fileSystemTasks.pop_front(); |
| 114 } |
| 115 return retValue; |
| 116 } |
| 117 |
97 void TearDown() override | 118 void TearDown() override |
98 { | 119 { |
99 removeFileIfExists("patterns.ini"); | 120 removeFileIfExists("patterns.ini"); |
100 removeFileIfExists("prefs.json"); | 121 removeFileIfExists("prefs.json"); |
101 fileSystem.reset(); | 122 fileSystem.reset(); |
102 } | 123 } |
103 void removeFileIfExists(const std::string& path) | 124 void removeFileIfExists(const std::string& path) |
104 { | 125 { |
105 // Hack: allow IO to finish currently running operations, in particular | 126 bool hasStatRun = false; |
106 // writing into files. Otherwise we get "Permission denied". | 127 bool doesFileExists; |
107 auto safeRemove = [this, &path]()->bool | 128 fileSystem->Stat(path, [&hasStatRun, &doesFileExists](const IFileSystem::S
tatResult& stats, const std::string& error) |
108 { | 129 { |
109 try | 130 EXPECT_TRUE(error.empty()) << error; |
110 { | 131 doesFileExists = stats.exists; |
111 Sync sync; | 132 hasStatRun = true; |
112 auto fs = fileSystem; | 133 }); |
113 fileSystem->Stat(path, | 134 while (!hasStatRun && !fileSystemTasks.empty()) |
114 [fs, &path, &sync](const IFileSystem::StatResult& stats, const std::
string& error) | 135 { |
115 { | 136 (*fileSystemTasks.begin())(); |
116 if (error.empty() && stats.exists) | 137 fileSystemTasks.pop_front(); |
117 { | 138 } |
118 fs->Remove(path, [&sync](const std::string& error) | 139 |
119 { | 140 if (!doesFileExists) |
120 sync.Set(error); | 141 return; |
121 }); | 142 |
122 } | 143 bool hasRemoveRun = false; |
123 else | 144 fileSystem->Remove(path, [&hasRemoveRun](const std::string& error) |
124 sync.Set(error); | 145 { |
125 }); | 146 EXPECT_TRUE(error.empty()) << error; |
126 sync.WaitFor(); | 147 hasRemoveRun = true; |
127 return sync.GetError().empty(); | 148 }); |
128 } | 149 while (!hasStatRun && !fileSystemTasks.empty()) |
129 catch (...) | 150 { |
130 { | 151 (*fileSystemTasks.begin())(); |
131 return false; | 152 fileSystemTasks.pop_front(); |
132 } | 153 } |
133 }; | |
134 int i = 5; | |
135 while ((i-- > 0 && weakJsEngine.lock()) || !safeRemove()) | |
136 std::this_thread::sleep_for(std::chrono::seconds(2)); | |
137 } | 154 } |
138 }; | 155 }; |
139 | 156 |
140 class FilterEngineIsSubscriptionDownloadAllowedTest : public ::testing::Test | 157 class FilterEngineIsSubscriptionDownloadAllowedTest : public ::testing::Test |
141 { | 158 { |
142 protected: | 159 protected: |
143 typedef std::vector<std::pair<bool, std::string>> ConnectionTypes; | 160 typedef std::vector<std::pair<bool, std::string>> ConnectionTypes; |
144 DelayedWebRequest::SharedTasks webRequestTasks; | 161 DelayedWebRequest::SharedTasks webRequestTasks; |
145 DelayedTimer::SharedTasks timerTasks; | 162 DelayedTimer::SharedTasks timerTasks; |
146 FilterEngine::CreationParameters createParams; | 163 FilterEngine::CreationParameters createParams; |
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 ASSERT_FALSE(filterEngine->IsElemhideWhitelisted( | 677 ASSERT_FALSE(filterEngine->IsElemhideWhitelisted( |
661 "http://example.co.uk", | 678 "http://example.co.uk", |
662 documentUrls1)); | 679 documentUrls1)); |
663 } | 680 } |
664 | 681 |
665 TEST_F(FilterEngineWithFreshFolder, LangAndAASubscriptionsAreChosenOnFirstRun) | 682 TEST_F(FilterEngineWithFreshFolder, LangAndAASubscriptionsAreChosenOnFirstRun) |
666 { | 683 { |
667 AppInfo appInfo; | 684 AppInfo appInfo; |
668 appInfo.locale = "zh"; | 685 appInfo.locale = "zh"; |
669 const std::string langSubscriptionUrl = "https://easylist-downloads.adblockplu
s.org/easylistchina+easylist.txt"; | 686 const std::string langSubscriptionUrl = "https://easylist-downloads.adblockplu
s.org/easylistchina+easylist.txt"; |
670 auto jsEngine = createJsEngine(appInfo); | 687 auto jsEngine = CreateJsEngine(appInfo); |
671 auto filterEngine = AdblockPlus::FilterEngine::Create(jsEngine); | 688 auto filterEngine = CreateFilterEngine(jsEngine); |
672 const auto subscriptions = filterEngine->GetListedSubscriptions(); | 689 const auto subscriptions = filterEngine->GetListedSubscriptions(); |
673 ASSERT_EQ(2u, subscriptions.size()); | 690 ASSERT_EQ(2u, subscriptions.size()); |
674 std::unique_ptr<Subscription> aaSubscription; | 691 std::unique_ptr<Subscription> aaSubscription; |
675 std::unique_ptr<Subscription> langSubscription; | 692 std::unique_ptr<Subscription> langSubscription; |
676 if (subscriptions[0].IsAA()) | 693 if (subscriptions[0].IsAA()) |
677 { | 694 { |
678 aaSubscription.reset(new Subscription(subscriptions[0])); | 695 aaSubscription.reset(new Subscription(subscriptions[0])); |
679 langSubscription.reset(new Subscription(subscriptions[1])); | 696 langSubscription.reset(new Subscription(subscriptions[1])); |
680 } | 697 } |
681 else if (subscriptions[1].IsAA()) | 698 else if (subscriptions[1].IsAA()) |
682 { | 699 { |
683 aaSubscription.reset(new Subscription(subscriptions[1])); | 700 aaSubscription.reset(new Subscription(subscriptions[1])); |
684 langSubscription.reset(new Subscription(subscriptions[0])); | 701 langSubscription.reset(new Subscription(subscriptions[0])); |
685 } | 702 } |
686 ASSERT_NE(nullptr, aaSubscription); | 703 ASSERT_NE(nullptr, aaSubscription); |
687 ASSERT_NE(nullptr, langSubscription); | 704 ASSERT_NE(nullptr, langSubscription); |
688 EXPECT_EQ(langSubscriptionUrl, langSubscription->GetProperty("url").AsString()
); | 705 EXPECT_EQ(langSubscriptionUrl, langSubscription->GetProperty("url").AsString()
); |
689 EXPECT_TRUE(filterEngine->IsAAEnabled()); | 706 EXPECT_TRUE(filterEngine->IsAAEnabled()); |
690 } | 707 } |
691 | 708 |
692 TEST_F(FilterEngineWithFreshFolder, DisableSubscriptionsAutoSelectOnFirstRun) | 709 TEST_F(FilterEngineWithFreshFolder, DisableSubscriptionsAutoSelectOnFirstRun) |
693 { | 710 { |
694 auto jsEngine = createJsEngine(); | 711 auto jsEngine = CreateJsEngine(); |
695 FilterEngine::CreationParameters createParams; | 712 FilterEngine::CreationParameters createParams; |
696 createParams.preconfiguredPrefs.emplace("first_run_subscription_auto_select",
jsEngine->NewValue(false)); | 713 createParams.preconfiguredPrefs.emplace("first_run_subscription_auto_select",
jsEngine->NewValue(false)); |
697 auto filterEngine = AdblockPlus::FilterEngine::Create(jsEngine, createParams); | 714 auto filterEngine = CreateFilterEngine(jsEngine, createParams); |
698 const auto subscriptions = filterEngine->GetListedSubscriptions(); | 715 const auto subscriptions = filterEngine->GetListedSubscriptions(); |
699 EXPECT_EQ(0u, subscriptions.size()); | 716 EXPECT_EQ(0u, subscriptions.size()); |
700 EXPECT_FALSE(filterEngine->IsAAEnabled()); | 717 EXPECT_FALSE(filterEngine->IsAAEnabled()); |
701 } | 718 } |
702 | 719 |
703 namespace AA_ApiTest | 720 namespace AA_ApiTest |
704 { | 721 { |
705 const std::string kOtherSubscriptionUrl = "https://non-existing-subscription.t
xt"; | 722 const std::string kOtherSubscriptionUrl = "https://non-existing-subscription.t
xt"; |
706 enum class AAStatus | 723 enum class AAStatus |
707 { | 724 { |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1024 std::string testConnection = "test connection"; | 1041 std::string testConnection = "test connection"; |
1025 filterEngine->SetAllowedConnectionType(&testConnection); | 1042 filterEngine->SetAllowedConnectionType(&testConnection); |
1026 auto subscription = EnsureExampleSubscriptionAndForceUpdate("subB"); | 1043 auto subscription = EnsureExampleSubscriptionAndForceUpdate("subB"); |
1027 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStr
ing()); | 1044 EXPECT_EQ("synchronize_ok", subscription.GetProperty("downloadStatus").AsStr
ing()); |
1028 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); | 1045 EXPECT_EQ(1u, subscription.GetProperty("filters").AsList().size()); |
1029 ASSERT_EQ(1u, capturedConnectionTypes.size()); | 1046 ASSERT_EQ(1u, capturedConnectionTypes.size()); |
1030 EXPECT_TRUE(capturedConnectionTypes[0].first); | 1047 EXPECT_TRUE(capturedConnectionTypes[0].first); |
1031 EXPECT_EQ(testConnection, capturedConnectionTypes[0].second); | 1048 EXPECT_EQ(testConnection, capturedConnectionTypes[0].second); |
1032 } | 1049 } |
1033 } | 1050 } |
OLD | NEW |