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

Unified Diff: test/Notification.cpp

Issue 5797488346791936: Issue 1107 - Support notifications (Closed)
Patch Set: move MarkAsShown into Notification class and get rid of locale arg in Notification::GetTexts Created Jan. 22, 2015, 10:02 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« include/AdblockPlus/Notification.h ('K') | « src/Notification.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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());
+}
« include/AdblockPlus/Notification.h ('K') | « src/Notification.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld