| Index: test/FileSystemJsObject.cpp | 
| =================================================================== | 
| new file mode 100644 | 
| --- /dev/null | 
| +++ b/test/FileSystemJsObject.cpp | 
| @@ -0,0 +1,233 @@ | 
| +#include <AdblockPlus.h> | 
| +#include <gtest/gtest.h> | 
| + | 
| +#include "../src/Thread.h" | 
| +#include "../src/Utils.h" | 
| + | 
| +namespace | 
| +{ | 
| + class MockFileSystem : public AdblockPlus::FileSystem | 
| + { | 
| + public: | 
| + bool success; | 
| + std::string contentToRead; | 
| + std::string lastWrittenPath; | 
| + std::string lastWrittenContent; | 
| + std::string movedFrom; | 
| + std::string movedTo; | 
| + std::string removedPath; | 
| + mutable std::string statPath; | 
| + bool statExists; | 
| + bool statIsDirectory; | 
| + bool statIsFile; | 
| + int statLastModified; | 
| + | 
| + MockFileSystem() : success(true) | 
| + { | 
| + } | 
| + | 
| + std::tr1::shared_ptr<std::istream> Read(const std::string& path) const | 
| + { | 
| + if (!success) | 
| + throw std::runtime_error("Unable to read " + path); | 
| + std::stringstream* const stream = new std::stringstream; | 
| + *stream << contentToRead; | 
| + return std::tr1::shared_ptr<std::istream>(stream); | 
| + } | 
| + | 
| + void Write(const std::string& path, std::tr1::shared_ptr<std::ostream> data) | 
| + { | 
| + if (!success) | 
| + throw std::runtime_error("Unable to write to " + path); | 
| + lastWrittenPath = path; | 
| + lastWrittenContent = AdblockPlus::Utils::Slurp(*data); | 
| + } | 
| + | 
| + void Move(const std::string& fromPath, const std::string& toPath) | 
| + { | 
| + if (!success) | 
| + throw std::runtime_error("Unable to move " + fromPath + " to " | 
| + + toPath); | 
| + movedFrom = fromPath; | 
| + movedTo = toPath; | 
| + } | 
| + | 
| + void Remove(const std::string& path) | 
| + { | 
| + if (!success) | 
| + throw std::runtime_error("Unable to remove " + path); | 
| + removedPath = path; | 
| + } | 
| + | 
| + StatResult Stat(const std::string& path) const | 
| + { | 
| + if (!success) | 
| + throw std::runtime_error("Unable to stat " + path); | 
| + statPath = path; | 
| + StatResult result; | 
| + result.exists = statExists; | 
| + result.isDirectory = statIsDirectory; | 
| + result.isFile = statIsFile; | 
| + result.lastModified = statLastModified; | 
| + return result; | 
| + } | 
| + }; | 
| + | 
| + void ReadFile(AdblockPlus::JsEngine& jsEngine, std::string& content, | 
| + std::string& error) | 
| + { | 
| + jsEngine.Evaluate("_fileSystem.read('', function(r) {result = r})"); | 
| + AdblockPlus::Sleep(10); | 
| + content = jsEngine.Evaluate("result.content"); | 
| + error = jsEngine.Evaluate("result.error"); | 
| + } | 
| +} | 
| + | 
| +TEST(FileSystemJsObjectTest, Read) | 
| +{ | 
| + MockFileSystem fileSystem; | 
| + fileSystem.contentToRead = "foo"; | 
| + AdblockPlus::JsEngine jsEngine(&fileSystem, 0, 0); | 
| + std::string content; | 
| + std::string error; | 
| + ReadFile(jsEngine, content, error); | 
| + ASSERT_EQ("foo", content); | 
| + ASSERT_EQ("", error); | 
| +} | 
| + | 
| +TEST(FileSystemJsObjectTest, ReadIllegalArguments) | 
| +{ | 
| + AdblockPlus::JsEngine jsEngine(0, 0, 0); | 
| + ASSERT_ANY_THROW(jsEngine.Evaluate("_fileSystem.read()")); | 
| + ASSERT_ANY_THROW(jsEngine.Evaluate("_fileSystem.read('', '')")); | 
| +} | 
| + | 
| +TEST(FileSystemJsObjectTest, ReadError) | 
| +{ | 
| + MockFileSystem fileSystem; | 
| + fileSystem.success = false; | 
| + AdblockPlus::JsEngine jsEngine(&fileSystem, 0, 0); | 
| + std::string content; | 
| + std::string error; | 
| + ReadFile(jsEngine, content, error); | 
| + ASSERT_NE("", error); | 
| + ASSERT_EQ("", content); | 
| +} | 
| + | 
| +TEST(FileSystemJsObjectTest, Write) | 
| +{ | 
| + MockFileSystem fileSystem; | 
| + AdblockPlus::JsEngine jsEngine(&fileSystem, 0, 0); | 
| + jsEngine.Evaluate("_fileSystem.write('foo', 'bar', function(e) {error = e})"); | 
| + AdblockPlus::Sleep(10); | 
| + ASSERT_EQ("foo", fileSystem.lastWrittenPath); | 
| + ASSERT_EQ("bar", fileSystem.lastWrittenContent); | 
| + ASSERT_EQ("", jsEngine.Evaluate("error")); | 
| +} | 
| + | 
| +TEST(FileSystemJsObjectTest, WriteIllegalArguments) | 
| +{ | 
| + AdblockPlus::JsEngine jsEngine(0, 0, 0); | 
| + ASSERT_ANY_THROW(jsEngine.Evaluate("_fileSystem.write()")); | 
| + ASSERT_ANY_THROW(jsEngine.Evaluate("_fileSystem.write('', '', '')")); | 
| +} | 
| + | 
| +TEST(FileSystemJsObjectTest, WriteError) | 
| +{ | 
| + MockFileSystem fileSystem; | 
| + fileSystem.success = false; | 
| + AdblockPlus::JsEngine jsEngine(&fileSystem, 0, 0); | 
| + jsEngine.Evaluate("_fileSystem.write('foo', 'bar', function(e) {error = e})"); | 
| + AdblockPlus::Sleep(10); | 
| + ASSERT_NE("", jsEngine.Evaluate("error")); | 
| +} | 
| + | 
| +TEST(FileSystemJsObjectTest, Move) | 
| +{ | 
| + MockFileSystem fileSystem; | 
| + AdblockPlus::JsEngine jsEngine(&fileSystem, 0, 0); | 
| + jsEngine.Evaluate("_fileSystem.move('foo', 'bar', function(e) {error = e})"); | 
| + AdblockPlus::Sleep(10); | 
| + ASSERT_EQ("foo", fileSystem.movedFrom); | 
| + ASSERT_EQ("bar", fileSystem.movedTo); | 
| + ASSERT_EQ("", jsEngine.Evaluate("error")); | 
| +} | 
| + | 
| +TEST(FileSystemJsObjectTest, MoveIllegalArguments) | 
| +{ | 
| + AdblockPlus::JsEngine jsEngine(0, 0, 0); | 
| + ASSERT_ANY_THROW(jsEngine.Evaluate("_fileSystem.move()")); | 
| + ASSERT_ANY_THROW(jsEngine.Evaluate("_fileSystem.move('', '', '')")); | 
| +} | 
| + | 
| +TEST(FileSystemJsObjectTest, MoveError) | 
| +{ | 
| + MockFileSystem fileSystem; | 
| + fileSystem.success = false; | 
| + AdblockPlus::JsEngine jsEngine(&fileSystem, 0, 0); | 
| + jsEngine.Evaluate("_fileSystem.move('foo', 'bar', function(e) {error = e})"); | 
| + AdblockPlus::Sleep(10); | 
| + ASSERT_NE("", jsEngine.Evaluate("error")); | 
| +} | 
| + | 
| +TEST(FileSystemJsObjectTest, Remove) | 
| +{ | 
| + MockFileSystem fileSystem; | 
| + AdblockPlus::JsEngine jsEngine(&fileSystem, 0, 0); | 
| + jsEngine.Evaluate("_fileSystem.remove('foo', function(e) {error = e})"); | 
| + AdblockPlus::Sleep(10); | 
| + ASSERT_EQ("foo", fileSystem.removedPath); | 
| + ASSERT_EQ("", jsEngine.Evaluate("error")); | 
| +} | 
| + | 
| +TEST(FileSystemJsObjectTest, RemoveIllegalArguments) | 
| +{ | 
| + AdblockPlus::JsEngine jsEngine(0, 0, 0); | 
| + ASSERT_ANY_THROW(jsEngine.Evaluate("_fileSystem.remove()")); | 
| + ASSERT_ANY_THROW(jsEngine.Evaluate("_fileSystem.remove('', '')")); | 
| +} | 
| + | 
| +TEST(FileSystemJsObjectTest, RemoveError) | 
| +{ | 
| + MockFileSystem fileSystem; | 
| + fileSystem.success = false; | 
| + AdblockPlus::JsEngine jsEngine(&fileSystem, 0, 0); | 
| + jsEngine.Evaluate("_fileSystem.remove('foo', function(e) {error = e})"); | 
| + AdblockPlus::Sleep(10); | 
| + ASSERT_NE("", jsEngine.Evaluate("error")); | 
| +} | 
| + | 
| +TEST(FileSystemJsObjectTest, Stat) | 
| +{ | 
| + MockFileSystem fileSystem; | 
| + fileSystem.statExists = true; | 
| + fileSystem.statIsDirectory= false; | 
| + fileSystem.statIsFile = true; | 
| + fileSystem.statLastModified = 1337; | 
| + AdblockPlus::JsEngine jsEngine(&fileSystem, 0, 0); | 
| + jsEngine.Evaluate("_fileSystem.stat('foo', function(r) {result = r})"); | 
| + AdblockPlus::Sleep(10); | 
| + ASSERT_EQ("foo", fileSystem.statPath); | 
| + ASSERT_EQ("", jsEngine.Evaluate("result.error")); | 
| + ASSERT_EQ("true", jsEngine.Evaluate("result.exists")); | 
| + ASSERT_EQ("false", jsEngine.Evaluate("result.isDirectory")); | 
| + ASSERT_EQ("true", jsEngine.Evaluate("result.isFile")); | 
| + ASSERT_EQ("1337", jsEngine.Evaluate("result.lastModified")); | 
| +} | 
| + | 
| +TEST(FileSystemJsObjectTest, StatIllegalArguments) | 
| +{ | 
| + AdblockPlus::JsEngine jsEngine(0, 0, 0); | 
| + ASSERT_ANY_THROW(jsEngine.Evaluate("_fileSystem.stat()")); | 
| + ASSERT_ANY_THROW(jsEngine.Evaluate("_fileSystem.stat('', '')")); | 
| +} | 
| + | 
| +TEST(FileSystemJsObjectTest, StatError) | 
| +{ | 
| + MockFileSystem fileSystem; | 
| + fileSystem.success = false; | 
| + AdblockPlus::JsEngine jsEngine(&fileSystem, 0, 0); | 
| + jsEngine.Evaluate("_fileSystem.stat('foo', function(r) {result = r})"); | 
| + AdblockPlus::Sleep(10); | 
| + ASSERT_NE("", jsEngine.Evaluate("result.error")); | 
| +} |