| 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 #ifndef MOCKS_H | 18 #ifndef MOCKS_H | 
| 19 #define MOCKS_H | 19 #define MOCKS_H | 
| 20 | 20 | 
|  | 21 #include <thread> | 
|  | 22 | 
| 21 #include <AdblockPlus.h> | 23 #include <AdblockPlus.h> | 
| 22 #include <gtest/gtest.h> | 24 #include <gtest/gtest.h> | 
| 23 #include "../src/Thread.h" | 25 #include "../src/Thread.h" | 
|  | 26 #include "../src/Utils.h" | 
|  | 27 | 
|  | 28 class Sync | 
|  | 29 { | 
|  | 30 public: | 
|  | 31   Sync() | 
|  | 32     : set(false) | 
|  | 33   { | 
|  | 34   } | 
|  | 35   void Wait(int sec = 20) | 
|  | 36   { | 
|  | 37     std::unique_lock<std::mutex> lock(mutex); | 
|  | 38     while (!set) | 
|  | 39       cv.wait_for(lock, std::chrono::seconds(sec)); | 
|  | 40   } | 
|  | 41   void Set(const std::string& error_ = std::string()) | 
|  | 42   { | 
|  | 43     { | 
|  | 44       std::unique_lock<std::mutex> lock(mutex); | 
|  | 45       set = true; | 
|  | 46       error = error_; | 
|  | 47     } | 
|  | 48     cv.notify_all(); | 
|  | 49   } | 
|  | 50   std::string GetError() | 
|  | 51   { | 
|  | 52     std::unique_lock<std::mutex> lock(mutex); | 
|  | 53     return error; | 
|  | 54   } | 
|  | 55 private: | 
|  | 56   std::mutex mutex; | 
|  | 57   std::condition_variable cv; | 
|  | 58   bool set; | 
|  | 59   std::string error; | 
|  | 60 }; | 
| 24 | 61 | 
| 25 // Strictly speaking in each test there should be a special implementation of | 62 // Strictly speaking in each test there should be a special implementation of | 
| 26 // an interface, which is merely referenced by a wrapper and the latter should | 63 // an interface, which is merely referenced by a wrapper and the latter should | 
| 27 // be injected into JsEngine or what ever. However the everthing a test often | 64 // be injected into JsEngine or what ever. However the everthing a test often | 
| 28 // actually needs is the access to pending tasks. Therefore instantiation of | 65 // actually needs is the access to pending tasks. Therefore instantiation of | 
| 29 // implemenation of an interface, creation of shared tasks and sharing them | 66 // implemenation of an interface, creation of shared tasks and sharing them | 
| 30 // with tasks in test is located in this class. | 67 // with tasks in test is located in this class. | 
| 31 // | 68 // | 
| 32 // Task is passed as an additional template parameter instead of using traits | 69 // Task is passed as an additional template parameter instead of using traits | 
| 33 // (CRTP does not work with types in derived class) merely to simplify the code | 70 // (CRTP does not work with types in derived class) merely to simplify the code | 
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 95 class ThrowingLogSystem : public AdblockPlus::LogSystem | 132 class ThrowingLogSystem : public AdblockPlus::LogSystem | 
| 96 { | 133 { | 
| 97 public: | 134 public: | 
| 98   void operator()(LogLevel logLevel, const std::string& message, | 135   void operator()(LogLevel logLevel, const std::string& message, | 
| 99         const std::string& source) | 136         const std::string& source) | 
| 100   { | 137   { | 
| 101     throw std::runtime_error("Unexpected error: " + message); | 138     throw std::runtime_error("Unexpected error: " + message); | 
| 102   } | 139   } | 
| 103 }; | 140 }; | 
| 104 | 141 | 
| 105 class ThrowingFileSystem : public AdblockPlus::FileSystem | 142 class ThrowingFileSystem : public AdblockPlus::IFileSystem, public AdblockPlus::
     FileSystem | 
| 106 { | 143 { | 
| 107 public: | 144 public: | 
| 108   std::shared_ptr<std::istream> Read(const std::string& path) const | 145   std::shared_ptr<std::istream> Read(const std::string& path) const | 
| 109   { | 146   { | 
| 110     throw std::runtime_error("Not implemented"); | 147     throw std::runtime_error("Not implemented"); | 
| 111   } | 148   } | 
|  | 149   void Read(const std::string& path, | 
|  | 150             const ReadCallback& callback) const | 
|  | 151   { | 
|  | 152     throw std::runtime_error("Not implemented"); | 
|  | 153   } | 
| 112 | 154 | 
| 113   void Write(const std::string& path, std::istream& content) | 155   void Write(const std::string& path, std::istream& content) | 
| 114   { | 156   { | 
| 115     throw std::runtime_error("Not implemented"); | 157     throw std::runtime_error("Not implemented"); | 
| 116   } | 158   } | 
|  | 159   void Write(const std::string& path, std::shared_ptr<std::istream> data, | 
|  | 160              const Callback& callback) | 
|  | 161   { | 
|  | 162     throw std::runtime_error("Not implemented"); | 
|  | 163   } | 
| 117 | 164 | 
| 118   void Move(const std::string& fromPath, const std::string& toPath) | 165   void Move(const std::string& fromPath, const std::string& toPath) | 
| 119   { | 166   { | 
| 120     throw std::runtime_error("Not implemented"); | 167     throw std::runtime_error("Not implemented"); | 
| 121   } | 168   } | 
|  | 169   void Move(const std::string& fromPath, const std::string& toPath, | 
|  | 170             const Callback& callback) | 
|  | 171   { | 
|  | 172     throw std::runtime_error("Not implemented"); | 
|  | 173   } | 
| 122 | 174 | 
| 123   void Remove(const std::string& path) | 175   void Remove(const std::string& path) | 
| 124   { | 176   { | 
| 125     throw std::runtime_error("Not implemented"); | 177     throw std::runtime_error("Not implemented"); | 
| 126   } | 178   } | 
|  | 179   void Remove(const std::string& path, const Callback& callback) | 
|  | 180   { | 
|  | 181     throw std::runtime_error("Not implemented"); | 
|  | 182   } | 
| 127 | 183 | 
| 128   StatResult Stat(const std::string& path) const | 184   StatResult Stat(const std::string& path) const | 
| 129   { | 185   { | 
| 130     throw std::runtime_error("Not implemented"); | 186     throw std::runtime_error("Not implemented"); | 
| 131   } | 187   } | 
|  | 188   void Stat(const std::string& path, | 
|  | 189             const StatCallback& callback) const | 
|  | 190   { | 
|  | 191     throw std::runtime_error("Not implemented"); | 
|  | 192   } | 
| 132 | 193 | 
| 133   std::string Resolve(const std::string& path) const | 194   std::string Resolve(const std::string& path) const | 
| 134   { | 195   { | 
| 135     throw std::runtime_error("Not implemented"); | 196     throw std::runtime_error("Not implemented"); | 
| 136   } | 197   } | 
| 137 |  | 
| 138 }; | 198 }; | 
| 139 | 199 | 
| 140 class ThrowingWebRequest : public AdblockPlus::IWebRequest | 200 class ThrowingWebRequest : public AdblockPlus::IWebRequest | 
| 141 { | 201 { | 
| 142 public: | 202 public: | 
| 143   void GET(const std::string& url, const AdblockPlus::HeaderList& requestHeaders
     , const GetCallback&) override | 203   void GET(const std::string& url, const AdblockPlus::HeaderList& requestHeaders
     , const GetCallback&) override | 
| 144   { | 204   { | 
| 145     throw std::runtime_error("Unexpected GET: " + url); | 205     throw std::runtime_error("Unexpected GET: " + url); | 
| 146   } | 206   } | 
| 147 }; | 207 }; | 
| 148 | 208 | 
| 149 class LazyFileSystem : public AdblockPlus::FileSystem | 209 class LazyFileSystem : public AdblockPlus::IFileSystem, public AdblockPlus::File
     System | 
| 150 { | 210 { | 
| 151 public: | 211 public: | 
| 152   std::shared_ptr<std::istream> Read(const std::string& path) const | 212   std::shared_ptr<std::istream> Read(const std::string& path) const | 
| 153   { | 213   { | 
| 154     std::string dummyData(""); | 214     std::string dummyData(""); | 
| 155     if (path == "patterns.ini") | 215     if (path == "patterns.ini") | 
| 156       dummyData = "# Adblock Plus preferences\n[Subscription]\nurl=~fl~"; | 216       dummyData = "# Adblock Plus preferences\n[Subscription]\nurl=~fl~"; | 
| 157     else if (path == "prefs.json") | 217     else if (path == "prefs.json") | 
| 158       dummyData = "{}"; | 218       dummyData = "{}"; | 
| 159     return std::shared_ptr<std::istream>(new std::istringstream(dummyData)); | 219     return std::shared_ptr<std::istream>(new std::istringstream(dummyData)); | 
| 160   } | 220   } | 
| 161 | 221 | 
|  | 222   void Read(const std::string& path, const ReadCallback& callback) const | 
|  | 223   { | 
|  | 224     std::thread([this, path, callback] | 
|  | 225     { | 
|  | 226       auto result = Read(path); | 
|  | 227       std::string content = AdblockPlus::Utils::Slurp(*result); | 
|  | 228       callback(std::move(content), ""); | 
|  | 229     }).detach(); | 
|  | 230   } | 
|  | 231 | 
| 162   void Write(const std::string& path, std::istream& content) | 232   void Write(const std::string& path, std::istream& content) | 
| 163   { | 233   { | 
| 164   } | 234   } | 
| 165 | 235 | 
|  | 236   void Write(const std::string& path, std::shared_ptr<std::istream> data, | 
|  | 237              const Callback& callback) | 
|  | 238   { | 
|  | 239     std::thread([this, path, data, callback] | 
|  | 240     { | 
|  | 241       Write(path, *data); | 
|  | 242       callback(""); | 
|  | 243     }).detach(); | 
|  | 244   } | 
|  | 245 | 
| 166   void Move(const std::string& fromPath, const std::string& toPath) | 246   void Move(const std::string& fromPath, const std::string& toPath) | 
| 167   { | 247   { | 
| 168   } | 248   } | 
| 169 | 249 | 
|  | 250   void Move(const std::string& fromPath, const std::string& toPath, | 
|  | 251             const Callback& callback) | 
|  | 252   { | 
|  | 253     std::thread([this, fromPath, toPath, callback] | 
|  | 254     { | 
|  | 255       Move(fromPath, toPath); | 
|  | 256       callback(""); | 
|  | 257     }).detach(); | 
|  | 258   } | 
|  | 259 | 
| 170   void Remove(const std::string& path) | 260   void Remove(const std::string& path) | 
| 171   { | 261   { | 
| 172   } | 262   } | 
| 173 | 263 | 
|  | 264   void Remove(const std::string& path, const Callback& callback) | 
|  | 265   { | 
|  | 266     std::thread([this, path, callback] | 
|  | 267     { | 
|  | 268       Remove(path); | 
|  | 269       callback(""); | 
|  | 270     }).detach(); | 
|  | 271   } | 
|  | 272 | 
| 174   StatResult Stat(const std::string& path) const | 273   StatResult Stat(const std::string& path) const | 
| 175   { | 274   { | 
| 176     StatResult result; | 275     StatResult result; | 
| 177     if (path == "patterns.ini") | 276     if (path == "patterns.ini") | 
| 178     { | 277     { | 
| 179       result.exists = true; | 278       result.exists = true; | 
| 180       result.isFile = true; | 279       result.isFile = true; | 
| 181     } | 280     } | 
| 182     return result; | 281     return result; | 
| 183   } | 282   } | 
| 184 | 283 | 
|  | 284   void Stat(const std::string& path, const StatCallback& callback) const | 
|  | 285   { | 
|  | 286     std::thread([this, path, callback] | 
|  | 287     { | 
|  | 288       callback(Stat(path), ""); | 
|  | 289     }).detach(); | 
|  | 290   } | 
|  | 291 | 
| 185   std::string Resolve(const std::string& path) const | 292   std::string Resolve(const std::string& path) const | 
| 186   { | 293   { | 
| 187     return path; | 294     return path; | 
| 188   } | 295   } | 
| 189 }; | 296 }; | 
| 190 | 297 | 
| 191 class NoopWebRequest : public AdblockPlus::IWebRequest | 298 class NoopWebRequest : public AdblockPlus::IWebRequest | 
| 192 { | 299 { | 
| 193 public: | 300 public: | 
| 194   void GET(const std::string& url, const AdblockPlus::HeaderList& requestHeaders
     , const GetCallback& callback) override | 301   void GET(const std::string& url, const AdblockPlus::HeaderList& requestHeaders
     , const GetCallback& callback) override | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 240 protected: | 347 protected: | 
| 241   AdblockPlus::JsEnginePtr jsEngine; | 348   AdblockPlus::JsEnginePtr jsEngine; | 
| 242 | 349 | 
| 243   virtual void SetUp() | 350   virtual void SetUp() | 
| 244   { | 351   { | 
| 245     jsEngine = CreateJsEngine(); | 352     jsEngine = CreateJsEngine(); | 
| 246   } | 353   } | 
| 247 }; | 354 }; | 
| 248 | 355 | 
| 249 #endif | 356 #endif | 
| OLD | NEW | 
|---|