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

Side by Side 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.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW
« 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