Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: test/BaseJsTest.h

Issue 29449592: Issue 5183 - Provide async interface for FileSystem (Closed) Base URL: https://hg.adblockplus.org/libadblockplus/
Patch Set: Updated implementation. Created June 2, 2017, 3:49 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« lib/init.js ('K') | « src/JsEngine.cpp ('k') | test/BaseJsTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
{
« lib/init.js ('K') | « src/JsEngine.cpp ('k') | test/BaseJsTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld