| Index: test/BaseJsTest.h |
| =================================================================== |
| --- a/test/BaseJsTest.h |
| +++ b/test/BaseJsTest.h |
| @@ -13,19 +13,56 @@ |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| #ifndef MOCKS_H |
| #define MOCKS_H |
| +#include <thread> |
| + |
| #include <AdblockPlus.h> |
| #include <gtest/gtest.h> |
| #include "../src/Thread.h" |
| +#include "../src/Utils.h" |
| + |
| +class Sync |
| +{ |
| +public: |
| + Sync() |
| + : set(false) |
| + { |
| + } |
| + void Wait(int sec = 20) |
| + { |
| + std::unique_lock<std::mutex> lock(mutex); |
| + while (!set) |
| + cv.wait_for(lock, std::chrono::seconds(sec)); |
| + } |
| + void Set(const std::string& error_ = std::string()) |
| + { |
| + { |
| + std::unique_lock<std::mutex> lock(mutex); |
| + set = true; |
| + error = error_; |
| + } |
| + cv.notify_all(); |
| + } |
| + std::string GetError() |
| + { |
| + std::unique_lock<std::mutex> lock(mutex); |
| + return error; |
| + } |
| +private: |
| + std::mutex mutex; |
| + std::condition_variable cv; |
| + bool set; |
| + std::string error; |
| +}; |
| // Strictly speaking in each test there should be a special implementation of |
| // an interface, which is merely referenced by a wrapper and the latter should |
| // be injected into JsEngine or what ever. However the everthing a test often |
| // actually needs is the access to pending tasks. Therefore instantiation of |
| // implemenation of an interface, creation of shared tasks and sharing them |
| // with tasks in test is located in this class. |
| // |
| @@ -97,96 +134,166 @@ |
| public: |
| void operator()(LogLevel logLevel, const std::string& message, |
| const std::string& source) |
| { |
| throw std::runtime_error("Unexpected error: " + message); |
| } |
| }; |
| -class ThrowingFileSystem : public AdblockPlus::FileSystem |
| +class ThrowingFileSystem : public AdblockPlus::IFileSystem, public AdblockPlus::FileSystem |
| { |
| public: |
| std::shared_ptr<std::istream> Read(const std::string& path) const |
| { |
| throw std::runtime_error("Not implemented"); |
| } |
| + void Read(const std::string& path, |
| + const ReadCallback& callback) const |
| + { |
| + throw std::runtime_error("Not implemented"); |
| + } |
| void Write(const std::string& path, std::istream& content) |
| { |
| throw std::runtime_error("Not implemented"); |
| } |
| + void Write(const std::string& path, std::shared_ptr<std::istream> data, |
| + const Callback& callback) |
| + { |
| + throw std::runtime_error("Not implemented"); |
| + } |
| void Move(const std::string& fromPath, const std::string& toPath) |
| { |
| throw std::runtime_error("Not implemented"); |
| } |
| + void Move(const std::string& fromPath, const std::string& toPath, |
| + const Callback& callback) |
| + { |
| + throw std::runtime_error("Not implemented"); |
| + } |
| void Remove(const std::string& path) |
| { |
| throw std::runtime_error("Not implemented"); |
| } |
| + void Remove(const std::string& path, const Callback& callback) |
| + { |
| + throw std::runtime_error("Not implemented"); |
| + } |
| StatResult Stat(const std::string& path) const |
| { |
| throw std::runtime_error("Not implemented"); |
| } |
| + void Stat(const std::string& path, |
| + const StatCallback& callback) const |
| + { |
| + throw std::runtime_error("Not implemented"); |
| + } |
| std::string Resolve(const std::string& path) const |
| { |
| throw std::runtime_error("Not implemented"); |
| } |
| - |
| }; |
| class ThrowingWebRequest : public AdblockPlus::IWebRequest |
| { |
| public: |
| void GET(const std::string& url, const AdblockPlus::HeaderList& requestHeaders, const GetCallback&) override |
| { |
| throw std::runtime_error("Unexpected GET: " + url); |
| } |
| }; |
| -class LazyFileSystem : public AdblockPlus::FileSystem |
| +class LazyFileSystem : public AdblockPlus::IFileSystem, public AdblockPlus::FileSystem |
| { |
| public: |
| std::shared_ptr<std::istream> Read(const std::string& path) const |
| { |
| std::string dummyData(""); |
| if (path == "patterns.ini") |
| dummyData = "# Adblock Plus preferences\n[Subscription]\nurl=~fl~"; |
| else if (path == "prefs.json") |
| dummyData = "{}"; |
| return std::shared_ptr<std::istream>(new std::istringstream(dummyData)); |
| } |
| + void Read(const std::string& path, const ReadCallback& callback) const |
| + { |
| + std::thread([this, path, callback] |
| + { |
| + auto result = Read(path); |
| + std::string content = AdblockPlus::Utils::Slurp(*result); |
| + callback(std::move(content), ""); |
| + }).detach(); |
| + } |
| + |
| void Write(const std::string& path, std::istream& content) |
| { |
| } |
| + void Write(const std::string& path, std::shared_ptr<std::istream> data, |
| + const Callback& callback) |
| + { |
| + std::thread([this, path, data, callback] |
| + { |
| + Write(path, *data); |
| + callback(""); |
| + }).detach(); |
| + } |
| + |
| void Move(const std::string& fromPath, const std::string& toPath) |
| { |
| } |
| + void Move(const std::string& fromPath, const std::string& toPath, |
| + const Callback& callback) |
| + { |
| + std::thread([this, fromPath, toPath, callback] |
| + { |
| + Move(fromPath, toPath); |
| + callback(""); |
| + }).detach(); |
| + } |
| + |
| void Remove(const std::string& path) |
| { |
| } |
| + void Remove(const std::string& path, const Callback& callback) |
| + { |
| + std::thread([this, path, callback] |
| + { |
| + Remove(path); |
| + callback(""); |
| + }).detach(); |
| + } |
| + |
| StatResult Stat(const std::string& path) const |
| { |
| StatResult result; |
| if (path == "patterns.ini") |
| { |
| result.exists = true; |
| result.isFile = true; |
| } |
| return result; |
| } |
| + void Stat(const std::string& path, const StatCallback& callback) const |
| + { |
| + std::thread([this, path, callback] |
| + { |
| + callback(Stat(path), ""); |
| + }).detach(); |
| + } |
| + |
| std::string Resolve(const std::string& path) const |
| { |
| return path; |
| } |
| }; |
| class NoopWebRequest : public AdblockPlus::IWebRequest |
| { |