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-present eyeo GmbH | 3 * Copyright (C) 2006-present 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 #include <sstream> | 18 #include <sstream> |
19 #include "BaseJsTest.h" | 19 #include "BaseJsTest.h" |
20 #include "../src/Thread.h" | 20 #include "../src/Thread.h" |
21 | 21 |
| 22 using namespace AdblockPlus; |
| 23 |
22 namespace | 24 namespace |
23 { | 25 { |
24 class MockFileSystem : public AdblockPlus::IFileSystem | 26 class MockFileSystem : public AdblockPlus::IFileSystem |
25 { | 27 { |
26 public: | 28 public: |
27 bool success; | 29 bool success; |
28 IOBuffer contentToRead; | 30 IOBuffer contentToRead; |
29 std::string lastWrittenFile; | 31 std::string lastWrittenFile; |
30 IOBuffer lastWrittenContent; | 32 IOBuffer lastWrittenContent; |
31 std::string movedFrom; | 33 std::string movedFrom; |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 ASSERT_ANY_THROW(GetJsEngine().Evaluate("_fileSystem.stat()")); | 236 ASSERT_ANY_THROW(GetJsEngine().Evaluate("_fileSystem.stat()")); |
235 ASSERT_ANY_THROW(GetJsEngine().Evaluate("_fileSystem.stat('', '')")); | 237 ASSERT_ANY_THROW(GetJsEngine().Evaluate("_fileSystem.stat('', '')")); |
236 } | 238 } |
237 | 239 |
238 TEST_F(FileSystemJsObjectTest, StatError) | 240 TEST_F(FileSystemJsObjectTest, StatError) |
239 { | 241 { |
240 mockFileSystem->success = false; | 242 mockFileSystem->success = false; |
241 GetJsEngine().Evaluate("let result; _fileSystem.stat('foo', function(r) {resul
t = r})"); | 243 GetJsEngine().Evaluate("let result; _fileSystem.stat('foo', function(r) {resul
t = r})"); |
242 ASSERT_FALSE(GetJsEngine().Evaluate("result.error").IsUndefined()); | 244 ASSERT_FALSE(GetJsEngine().Evaluate("result.error").IsUndefined()); |
243 } | 245 } |
| 246 |
| 247 namespace |
| 248 { |
| 249 class FileSystemJsObject_ReadFromFileTest : public FileSystemJsObjectTest |
| 250 { |
| 251 public: |
| 252 typedef std::function<void(const std::string&)> ReadFromFileCallback; |
| 253 typedef std::vector<std::string> Lines; |
| 254 |
| 255 void readFromFile(const ReadFromFileCallback& onLine) |
| 256 { |
| 257 ASSERT_TRUE(onLine); |
| 258 auto& jsEngine = GetJsEngine(); |
| 259 bool isOnDoneCalled = false; |
| 260 jsEngine.SetEventCallback("onLine", [onLine](JsValueList&& /*line*/jsArgs) |
| 261 { |
| 262 ASSERT_EQ(1u, jsArgs.size()); |
| 263 EXPECT_TRUE(jsArgs[0].IsString()); |
| 264 onLine(jsArgs[0].AsString()); |
| 265 }); |
| 266 jsEngine.SetEventCallback("onDone", [this, &isOnDoneCalled](JsValueList&&
/*error*/jsArgs) |
| 267 { |
| 268 isOnDoneCalled = true; |
| 269 if (this->mockFileSystem->success) |
| 270 { |
| 271 EXPECT_EQ(0u, jsArgs.size()) << jsArgs[0].AsString(); |
| 272 } |
| 273 else |
| 274 { |
| 275 ASSERT_EQ(1u, jsArgs.size()); |
| 276 EXPECT_TRUE(jsArgs[0].IsString()); |
| 277 EXPECT_FALSE(jsArgs[0].AsString().empty()); |
| 278 } |
| 279 }); |
| 280 jsEngine.Evaluate(R"js(_fileSystem.readFromFile("foo", |
| 281 (line) => _triggerEvent("onLine", line), |
| 282 (error) => |
| 283 { |
| 284 if (error) |
| 285 _triggerEvent("onDone", error); |
| 286 else |
| 287 _triggerEvent("onDone"); |
| 288 });)js"); |
| 289 EXPECT_TRUE(isOnDoneCalled); |
| 290 } |
| 291 |
| 292 void readFromFile_Lines(const std::string& content, const Lines& expected) |
| 293 { |
| 294 mockFileSystem->contentToRead.assign(content.begin(), content.end()); |
| 295 std::vector<std::string> readLines; |
| 296 readFromFile([&readLines](const std::string& line) |
| 297 { |
| 298 readLines.emplace_back(line); |
| 299 }); |
| 300 |
| 301 ASSERT_EQ(expected.size(), readLines.size()); |
| 302 for (Lines::size_type i = 0; i < expected.size(); ++i) |
| 303 { |
| 304 EXPECT_EQ(expected[i], readLines[i]); |
| 305 } |
| 306 } |
| 307 }; |
| 308 } |
| 309 |
| 310 TEST_F(FileSystemJsObject_ReadFromFileTest, NoFile) |
| 311 { |
| 312 bool isOnLineCalled = false; |
| 313 mockFileSystem->success = false; |
| 314 readFromFile([&isOnLineCalled](const std::string& line) |
| 315 { |
| 316 isOnLineCalled = true; |
| 317 }); |
| 318 EXPECT_FALSE(isOnLineCalled); |
| 319 } |
| 320 |
| 321 TEST_F(FileSystemJsObject_ReadFromFileTest, Lines) |
| 322 { |
| 323 readFromFile_Lines({}, {""}); |
| 324 readFromFile_Lines({"\n"}, {""}); |
| 325 readFromFile_Lines({"\n\r"}, {""}); |
| 326 readFromFile_Lines({"\n\r\n"}, {""}); |
| 327 |
| 328 readFromFile_Lines({"line"}, {"line"}); |
| 329 |
| 330 readFromFile_Lines( |
| 331 "first\n" |
| 332 "second\r\n" |
| 333 "third\r\n" |
| 334 "\r\n" |
| 335 "\n" |
| 336 "last", |
| 337 {"first", "second", "third", "last"}); |
| 338 |
| 339 readFromFile_Lines( |
| 340 "first\n" |
| 341 "second\r\n" |
| 342 "third\n", |
| 343 {"first", "second", "third"}); |
| 344 |
| 345 readFromFile_Lines( |
| 346 "first\n" |
| 347 "second\r\n" |
| 348 "third\r\n", |
| 349 {"first", "second", "third"}); |
| 350 |
| 351 readFromFile_Lines( |
| 352 "first\n" |
| 353 "second\r\n" |
| 354 "third\r\n" |
| 355 "\r\n" |
| 356 "\n", |
| 357 {"first", "second", "third"}); |
| 358 |
| 359 readFromFile_Lines( |
| 360 "\n" |
| 361 "first\n" |
| 362 "second\r\n" |
| 363 "third\r\n", |
| 364 {"first", "second", "third"}); |
| 365 } |
| 366 |
| 367 TEST_F(FileSystemJsObject_ReadFromFileTest, ProcessLineThrowsException) |
| 368 { |
| 369 std::string content = "1\n2\n3"; |
| 370 mockFileSystem->contentToRead.assign(content.begin(), content.end()); |
| 371 |
| 372 std::vector<std::string> readLines; |
| 373 auto& jsEngine = GetJsEngine(); |
| 374 std::string error; |
| 375 jsEngine.SetEventCallback("onLine", [&readLines](JsValueList&& /*line*/jsArgs) |
| 376 { |
| 377 ASSERT_EQ(1u, jsArgs.size()); |
| 378 EXPECT_TRUE(jsArgs[0].IsString()); |
| 379 readLines.emplace_back(jsArgs[0].AsString()); |
| 380 }); |
| 381 jsEngine.SetEventCallback("onDone", [this, &error](JsValueList&& /*error*/jsAr
gs) |
| 382 { |
| 383 ASSERT_EQ(1u, jsArgs.size()); |
| 384 EXPECT_TRUE(jsArgs[0].IsString()); |
| 385 error = jsArgs[0].AsString(); |
| 386 }); |
| 387 jsEngine.Evaluate(R"js( |
| 388 let onLineCounter = 0; |
| 389 _fileSystem.readFromFile("foo", |
| 390 (line) => |
| 391 { |
| 392 if (onLineCounter++ == 2) |
| 393 { |
| 394 throw new Error("my-error"); |
| 395 } |
| 396 _triggerEvent("onLine", line); |
| 397 }, |
| 398 (error) => |
| 399 { |
| 400 if (error) |
| 401 _triggerEvent("onDone", error); |
| 402 else |
| 403 _triggerEvent("onDone"); |
| 404 });)js"); |
| 405 EXPECT_EQ(2u, readLines.size()); |
| 406 EXPECT_EQ("Error: my-error at undefined:8", error); |
| 407 } |
OLD | NEW |