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: Remove a #include Utils.h from test. Created June 2, 2017, 7:38 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
Index: test/BaseJsTest.h
===================================================================
--- a/test/BaseJsTest.h
+++ b/test/BaseJsTest.h
@@ -13,20 +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"
+class Sync
sergei 2017/06/16 15:05:55 There is a pretty similar class in src/FilterEngin
hub 2017/06/16 21:52:54 That's where it comes from. The problem with Util
sergei 2017/07/03 09:25:53 Acknowledged.
+{
+public:
+ Sync()
+ : set(false)
+ {
+ }
+ void Wait(int sec = 20)
sergei 2017/06/16 15:05:55 For the class in utils I think it makes sense to u
hub 2017/06/16 21:52:55 At that point I'd that have Wait() to have a std::
+ {
+ 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())
sergei 2017/06/16 15:05:55 unfortunately we are not using anything like m_ pr
hub 2017/06/16 21:52:55 This is actually for -Wshadow that sadly isn't ena
+ {
+ {
+ 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.
//
// Task is passed as an additional template parameter instead of using traits
@@ -97,96 +133,168 @@
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]
sergei 2017/06/16 15:05:55 I actually planned to gradually convert to a speci
hub 2017/06/16 21:52:55 Acknowledged.
+ {
+ auto result = Read(path);
+ std::stringstream stream;
+ stream << result->rdbuf();
+ std::string content = stream.str();
+ 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
{

Powered by Google App Engine
This is Rietveld