 Issue 5797488346791936:
  Issue 1107 - Support notifications  (Closed)
    
  
    Issue 5797488346791936:
  Issue 1107 - Support notifications  (Closed) 
  | Index: test/Notification.cpp | 
| diff --git a/test/Notification.cpp b/test/Notification.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..3890aafb21031feb25a4f80a6fe1f9251c3c53d7 | 
| --- /dev/null | 
| +++ b/test/Notification.cpp | 
| @@ -0,0 +1,238 @@ | 
| +/* | 
| + * 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); | 
| + } | 
| + }; | 
| + | 
| + 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\": \"Critical message\"," | 
| + "\"de\": \"Achtung\"" | 
| + "}," | 
| + "\"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, NotificationCtr) | 
| +{ | 
| + auto notification = filterEngine->CreateNotification(NotificationType::NOTIFICATION_TYPE_CRITICAL, "testId"); | 
| 
Wladimir Palant
2015/01/22 10:47:20
Instead of defining this API for tests only, pleas
 | 
| + ASSERT_NE(nullptr, notification); | 
| + EXPECT_EQ("testId", notification->GetId()); | 
| + EXPECT_EQ(NotificationType::NOTIFICATION_TYPE_CRITICAL, notification->GetType()); | 
| +} | 
| + | 
| +TEST_F(NotificationTest, UrlFilters) | 
| +{ | 
| + auto notification = filterEngine->CreateNotification(NotificationType::NOTIFICATION_TYPE_CRITICAL, "testId"); | 
| + ASSERT_NE(nullptr, notification); | 
| + EXPECT_EQ(0, notification->GetUrlFilters().size()); | 
| + notification->AddUrlFilter("filterA"); | 
| + { | 
| + auto urlFilters = notification->GetUrlFilters(); | 
| + ASSERT_EQ(1, urlFilters.size()); | 
| + EXPECT_EQ("filterA", urlFilters[0]); | 
| + } | 
| + notification->AddUrlFilter("filterB"); | 
| + { | 
| + auto urlFilters = notification->GetUrlFilters(); | 
| + ASSERT_EQ(2, urlFilters.size()); | 
| + EXPECT_EQ("filterA", urlFilters[0]); | 
| + EXPECT_EQ("filterB", urlFilters[1]); | 
| + } | 
| + notification->AddUrlFilter("filterC"); | 
| + { | 
| + auto urlFilters = notification->GetUrlFilters(); | 
| + ASSERT_EQ(3, urlFilters.size()); | 
| + EXPECT_EQ("filterA", urlFilters[0]); | 
| + EXPECT_EQ("filterB", urlFilters[1]); | 
| + EXPECT_EQ("filterC", urlFilters[2]); | 
| + } | 
| +} | 
| + | 
| +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()); | 
| +} | 
| +#endif | 
| + | 
| +TEST_F(NotificationTest, AddNotification) | 
| +{ | 
| + { | 
| + auto notification = filterEngine->CreateNotification(NotificationType::NOTIFICATION_TYPE_INFORMATION, "id"); | 
| + ASSERT_NE(nullptr, notification); | 
| + filterEngine->AddNotification(notification); | 
| + } | 
| + auto notification = filterEngine->GetNextNotificationToShow(); | 
| + ASSERT_NE(nullptr, notification.get()); | 
| + EXPECT_EQ("id", notification->GetId()); | 
| +} | 
| + | 
| +TEST_F(NotificationTest, FilterByUrl1) | 
| +{ | 
| + { | 
| + auto notification = filterEngine->CreateNotification(NotificationType::NOTIFICATION_TYPE_INFORMATION, "no-filter"); | 
| + ASSERT_NE(nullptr, notification); | 
| + filterEngine->AddNotification(notification); | 
| + } | 
| + { | 
| + auto notification = filterEngine->CreateNotification(NotificationType::NOTIFICATION_TYPE_INFORMATION, "com"); | 
| + ASSERT_NE(nullptr, notification); | 
| + notification->AddUrlFilter("http://www.com"); | 
| + filterEngine->AddNotification(notification); | 
| + } | 
| + { | 
| + auto notification = filterEngine->CreateNotification(NotificationType::NOTIFICATION_TYPE_INFORMATION, "de"); | 
| + ASSERT_NE(nullptr, notification); | 
| + notification->AddUrlFilter("http://www.de"); | 
| + filterEngine->AddNotification(notification); | 
| + } | 
| + auto notification = filterEngine->GetNextNotificationToShow(); | 
| + ASSERT_NE(nullptr, notification.get()); | 
| + EXPECT_EQ("no-filter", notification->GetId()); | 
| + notification = filterEngine->GetNextNotificationToShow(); | 
| + EXPECT_EQ(nullptr, notification.get()); | 
| + notification = filterEngine->GetNextNotificationToShow("http://www.de"); | 
| + ASSERT_NE(nullptr, notification.get()); | 
| + EXPECT_EQ("de", notification->GetId()); | 
| +} | 
| +TEST_F(NotificationTest, FilterByUrl2) | 
| +{ | 
| + { | 
| + auto notification = filterEngine->CreateNotification(NotificationType::NOTIFICATION_TYPE_INFORMATION, "no-filter"); | 
| + ASSERT_NE(nullptr, notification); | 
| + filterEngine->AddNotification(notification); | 
| + } | 
| + { | 
| + auto notification = filterEngine->CreateNotification(NotificationType::NOTIFICATION_TYPE_INFORMATION, "com"); | 
| + ASSERT_NE(nullptr, notification); | 
| + notification->AddUrlFilter("http://www.com"); | 
| + filterEngine->AddNotification(notification); | 
| + } | 
| + { | 
| + auto notification = filterEngine->CreateNotification(NotificationType::NOTIFICATION_TYPE_INFORMATION, "de"); | 
| + ASSERT_NE(nullptr, notification); | 
| + notification->AddUrlFilter("http://www.de"); | 
| + filterEngine->AddNotification(notification); | 
| + } | 
| + auto notification = filterEngine->GetNextNotificationToShow("http://www.de"); | 
| + ASSERT_NE(nullptr, notification.get()); | 
| + EXPECT_EQ("de", notification->GetId()); | 
| + notification = filterEngine->GetNextNotificationToShow("http://www.de"); | 
| + EXPECT_EQ(nullptr, notification.get()); | 
| + notification = filterEngine->GetNextNotificationToShow(); | 
| + ASSERT_NE(nullptr, notification.get()); | 
| + EXPECT_EQ("no-filter", notification->GetId()); | 
| +} | 
| + | 
| +TEST_F(NotificationTest, AddRemoveNotification) | 
| +{ | 
| + auto newInfoNotification = filterEngine->CreateNotification(NotificationType::NOTIFICATION_TYPE_INFORMATION, "id"); | 
| + ASSERT_NE(nullptr, newInfoNotification); | 
| + filterEngine->AddNotification(newInfoNotification); | 
| + filterEngine->RemoveNotification(newInfoNotification); | 
| + EXPECT_EQ(nullptr, filterEngine->GetNextNotificationToShow().get()); | 
| +} | 
| + | 
| +TEST_F(NotificationTest, MarkAsShown) | 
| +{ | 
| + auto newInfoNotification = filterEngine->CreateNotification(NotificationType::NOTIFICATION_TYPE_INFORMATION, "id"); | 
| + ASSERT_NE(nullptr, newInfoNotification); | 
| + filterEngine->AddNotification(newInfoNotification); | 
| + newInfoNotification->MarkAsShown(); | 
| + EXPECT_EQ(nullptr, filterEngine->GetNextNotificationToShow().get()); | 
| +} |