| Index: test/Notification.cpp | 
| diff --git a/test/Notification.cpp b/test/Notification.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..1bc4ae683629667946c11698b90db231f005b433 | 
| --- /dev/null | 
| +++ b/test/Notification.cpp | 
| @@ -0,0 +1,172 @@ | 
| +/* | 
| + * This file is part of Adblock Plus <https://adblockplus.org/>, | 
| + * Copyright (C) 2006-2015 Eyeo GmbH | 
| + * | 
| + * Adblock Plus is free software: you can redistribute it and/or modify | 
| + * it under the terms of the GNU General Public License version 3 as | 
| + * published by the Free Software Foundation. | 
| + * | 
| + * Adblock Plus is distributed in the hope that it will be useful, | 
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| + * GNU General Public License for more details. | 
| + * | 
| + * You should have received a copy of the GNU General Public License | 
| + * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
| + */ | 
| + | 
| +#include "BaseJsTest.h" | 
| + | 
| +using namespace AdblockPlus; | 
| + | 
| +/* This define enables NotificationMockWebRequestTest but to run it | 
| +// one need to set INITIAL_DELAY to about 2000 msec in notification.js. | 
| +#include <chrono> | 
| +#include <thread> | 
| +#define NotificationMockWebRequestTest_ENABLED | 
| +//*/ | 
| + | 
| +namespace | 
| +{ | 
| +  typedef std::tr1::shared_ptr<FilterEngine> FilterEnginePtr; | 
| + | 
| +  class NotificationTest : public BaseJsTest | 
| +  { | 
| +  protected: | 
| +    FilterEnginePtr filterEngine; | 
| +    void SetUp() override | 
| +    { | 
| +      BaseJsTest::SetUp(); | 
| +      jsEngine->SetFileSystem(FileSystemPtr(new LazyFileSystem())); | 
| +      jsEngine->SetWebRequest(std::tr1::make_shared<LazyWebRequest>()); | 
| +      jsEngine->SetLogSystem(LogSystemPtr(new DefaultLogSystem())); | 
| +      filterEngine = std::tr1::make_shared<FilterEngine>(jsEngine); | 
| +    } | 
| + | 
| +    void AddNotificaiton(const std::string& notification) | 
| +    { | 
| +      jsEngine->Evaluate("(function()" | 
| +      "{" | 
| +        "require('notification').Notification.addNotification(" + notification + ");" | 
| +      "})();"); | 
| +    } | 
| +  }; | 
| + | 
| +  class MockWebRequest : public WebRequest | 
| +  { | 
| +  public: | 
| +    std::string m_responseText; | 
| +    explicit MockWebRequest(const std::string& notification) | 
| +      : m_responseText(notification) | 
| +    { | 
| +    } | 
| +    ServerResponse GET(const std::string& url, | 
| +      const HeaderList& requestHeaders) const override | 
| +    { | 
| +      if (url.find("/notification.json") == std::string::npos) | 
| +      { | 
| +        return ServerResponse(); | 
| +      } | 
| +      ServerResponse serverResponse; | 
| +      serverResponse.status = NS_OK; | 
| +      serverResponse.responseStatus = 200; | 
| +      serverResponse.responseText = m_responseText; | 
| +      return serverResponse; | 
| +    } | 
| +  }; | 
| + | 
| +#ifdef NotificationMockWebRequestTest_ENABLED | 
| +  class NotificationMockWebRequestTest : public BaseJsTest | 
| +  { | 
| +  protected: | 
| +    FilterEnginePtr filterEngine; | 
| +    void SetUp() override | 
| +    { | 
| +      BaseJsTest::SetUp(); | 
| +      jsEngine->SetFileSystem(std::tr1::make_shared<LazyFileSystem>()); | 
| +      const char* responseJsonText = "{" | 
| +        "\"notifications\": [{" | 
| +          "\"id\": \"some id\"," | 
| +          "\"type\": \"information\"," | 
| +          "\"message\": {" | 
| +             "\"en-US\": \"message\"" | 
| +          "}," | 
| +          "\"title\": \"Title\"" | 
| +        "}]" | 
| +        "}"; | 
| +      jsEngine->SetWebRequest(std::tr1::make_shared<MockWebRequest>(responseJsonText)); | 
| +      jsEngine->SetLogSystem(LogSystemPtr(new DefaultLogSystem())); | 
| +      filterEngine = std::tr1::make_shared<FilterEngine>(jsEngine); | 
| +    } | 
| +  }; | 
| +#endif | 
| +} | 
| + | 
| +TEST_F(NotificationTest, NoNotifications) | 
| +{ | 
| +  auto notification = filterEngine->GetNextNotificationToShow(); | 
| +  EXPECT_EQ(nullptr, notification); | 
| +} | 
| + | 
| +#ifdef NotificationMockWebRequestTest_ENABLED | 
| +TEST_F(NotificationMockWebRequestTest, SingleNotification) | 
| +{ | 
| +  std::this_thread::sleep_for(std::chrono::seconds(5)); // it's a hack | 
| +  auto notification = filterEngine->GetNextNotificationToShow(); | 
| +  // try another one immediately to avoid queuing of the next notification by | 
| +  // the timer. | 
| +  EXPECT_EQ(nullptr, filterEngine->GetNextNotificationToShow().get()); | 
| +  ASSERT_NE(nullptr, notification.get()); | 
| +  EXPECT_EQ(NotificationType::NOTIFICATION_TYPE_INFORMATION, notification->GetType()); | 
| +  EXPECT_EQ("Title", notification->GetTitle()); | 
| +  EXPECT_EQ("message", notification->GetMessageString()); | 
| +} | 
| +#endif | 
| + | 
| +TEST_F(NotificationTest, AddNotification) | 
| +{ | 
| +  AddNotificaiton("{" | 
| +      "type: 'critical'," | 
| +      "title: 'testTitle'," | 
| +      "message: 'testMessage'," | 
| +    "}"); | 
| +  auto notification = filterEngine->GetNextNotificationToShow(); | 
| +  ASSERT_NE(nullptr, notification.get()); | 
| +  EXPECT_EQ(NotificationType::NOTIFICATION_TYPE_CRITICAL, notification->GetType()); | 
| +  EXPECT_EQ("testTitle", notification->GetTitle()); | 
| +  EXPECT_EQ("testMessage", notification->GetMessageString()); | 
| +} | 
| + | 
| +TEST_F(NotificationTest, FilterByUrl1) | 
| +{ | 
| +  AddNotificaiton("{ id: 'no-filter', type: 'critical' }"); | 
| +  AddNotificaiton("{ id: 'www.com', type: 'information'," | 
| +    "urlFilters:['http://www.com']" | 
| +  "}"); | 
| +  AddNotificaiton("{ id: 'www.de', type: 'question'," | 
| +    "urlFilters:['http://www.de']" | 
| +  "}"); | 
| + | 
| +  auto notification = filterEngine->GetNextNotificationToShow(); | 
| +  ASSERT_NE(nullptr, notification.get()); | 
| +  EXPECT_EQ(NotificationType::NOTIFICATION_TYPE_CRITICAL, notification->GetType()); | 
| + | 
| +  notification = filterEngine->GetNextNotificationToShow("http://www.de"); | 
| +  ASSERT_NE(nullptr, notification.get()); | 
| +  EXPECT_EQ(NotificationType::NOTIFICATION_TYPE_QUESTION, notification->GetType()); | 
| + | 
| +  notification = filterEngine->GetNextNotificationToShow("http://www.com"); | 
| +  ASSERT_NE(nullptr, notification.get()); | 
| +  EXPECT_EQ(NotificationType::NOTIFICATION_TYPE_INFORMATION, notification->GetType()); | 
| +} | 
| + | 
| +TEST_F(NotificationTest, MarkAsShown) | 
| +{ | 
| +  AddNotificaiton("{ id: 'id', type: 'question' }"); | 
| +  auto notification = filterEngine->GetNextNotificationToShow(); | 
| +  EXPECT_NE(nullptr, notification); | 
| +  notification = filterEngine->GetNextNotificationToShow(); | 
| +  ASSERT_NE(nullptr, notification); | 
| +  notification->MarkAsShown(); | 
| +  EXPECT_EQ(nullptr, filterEngine->GetNextNotificationToShow().get()); | 
| +} | 
|  |