Index: chrome/browser/notifications/notification_platform_bridge_linux_unittest.cc |
diff --git a/chrome/browser/notifications/notification_platform_bridge_linux_unittest.cc b/chrome/browser/notifications/notification_platform_bridge_linux_unittest.cc |
index d3e8fa0a4698825560524d681616f25d39ec865c..c3bc7a1fb1596c735fe7e1949f6d9b1af8f721f1 100644 |
--- a/chrome/browser/notifications/notification_platform_bridge_linux_unittest.cc |
+++ b/chrome/browser/notifications/notification_platform_bridge_linux_unittest.cc |
@@ -11,7 +11,9 @@ |
#include "base/logging.h" |
#include "base/memory/ptr_util.h" |
#include "base/memory/ref_counted.h" |
+#include "base/strings/utf_string_conversions.h" |
#include "chrome/browser/notifications/notification.h" |
+#include "chrome/browser/notifications/notification_test_util.h" |
#include "content/public/test/test_browser_thread_bundle.h" |
#include "content/public/test/test_utils.h" |
#include "dbus/mock_bus.h" |
@@ -19,6 +21,10 @@ |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+using testing::_; |
+using testing::Return; |
+using testing::StrictMock; |
+ |
namespace { |
const char kFreedesktopNotificationsName[] = "org.freedesktop.Notifications"; |
@@ -38,6 +44,82 @@ ACTION_P(OnGetCapabilities, capabilities) { |
return response; |
} |
+ACTION_P(OnNotify, id) { |
+ // The "Notify" message must have type (susssasa{sv}i). |
+ // https://developer.gnome.org/notification-spec/#command-notify |
+ dbus::MethodCall* method_call = arg0; |
+ dbus::MessageReader reader(method_call); |
+ std::string str; |
+ uint32_t uint32; |
+ int32_t int32; |
+ EXPECT_TRUE(reader.PopString(&str)); |
+ EXPECT_TRUE(reader.PopUint32(&uint32)); |
+ EXPECT_TRUE(reader.PopString(&str)); |
+ EXPECT_TRUE(reader.PopString(&str)); |
+ EXPECT_TRUE(reader.PopString(&str)); |
+ |
+ { |
+ dbus::MessageReader actions_reader(nullptr); |
+ EXPECT_TRUE(reader.PopArray(&actions_reader)); |
+ while (actions_reader.HasMoreData()) { |
+ // Actions come in pairs. |
+ EXPECT_TRUE(actions_reader.PopString(&str)); |
+ EXPECT_TRUE(actions_reader.PopString(&str)); |
+ } |
+ } |
+ |
+ { |
+ dbus::MessageReader hints_reader(nullptr); |
+ EXPECT_TRUE(reader.PopArray(&hints_reader)); |
+ while (hints_reader.HasMoreData()) { |
+ dbus::MessageReader dict_entry_reader(nullptr); |
+ EXPECT_TRUE(hints_reader.PopDictEntry(&dict_entry_reader)); |
+ EXPECT_TRUE(dict_entry_reader.PopString(&str)); |
+ dbus::MessageReader variant_reader(nullptr); |
+ EXPECT_TRUE(dict_entry_reader.PopVariant(&variant_reader)); |
+ EXPECT_FALSE(dict_entry_reader.HasMoreData()); |
+ } |
+ } |
+ |
+ EXPECT_TRUE(reader.PopInt32(&int32)); |
+ EXPECT_FALSE(reader.HasMoreData()); |
+ |
+ dbus::Response* response = dbus::Response::CreateEmpty().release(); |
+ dbus::MessageWriter writer(response); |
+ writer.AppendUint32(id); |
+ return response; |
+} |
+ |
+ACTION(OnCloseNotification) { |
+ // The "CloseNotification" message must have type (u). |
+ // https://developer.gnome.org/notification-spec/#command-close-notification |
+ dbus::MethodCall* method_call = arg0; |
+ dbus::MessageReader reader(method_call); |
+ uint32_t uint32; |
+ EXPECT_TRUE(reader.PopUint32(&uint32)); |
+ EXPECT_FALSE(reader.HasMoreData()); |
+ |
+ return dbus::Response::CreateEmpty().release(); |
+} |
+ |
+// Matches a method call to the specified dbus target. |
+MATCHER_P(Calls, member, "") { |
+ return arg->GetMember() == member; |
+} |
+ |
+Notification CreateNotification(const char* id, |
+ const char* title, |
+ const char* body, |
+ const char* origin) { |
+ message_center::RichNotificationData optional_fields; |
+ GURL url = GURL(origin); |
+ return Notification(message_center::NOTIFICATION_TYPE_SIMPLE, |
+ base::UTF8ToUTF16(title), base::UTF8ToUTF16(body), |
+ gfx::Image(), message_center::NotifierId(url), |
+ base::UTF8ToUTF16("Notifier's Name"), url, id, |
+ optional_fields, new MockNotificationDelegate(id)); |
+} |
+ |
} // namespace |
class NotificationPlatformBridgeLinuxTest : public testing::Test { |
@@ -47,27 +129,27 @@ class NotificationPlatformBridgeLinuxTest : public testing::Test { |
void SetUp() override { |
mock_bus_ = new dbus::MockBus(dbus::Bus::Options()); |
- mock_notification_proxy_ = new testing::StrictMock<dbus::MockObjectProxy>( |
+ mock_notification_proxy_ = new StrictMock<dbus::MockObjectProxy>( |
mock_bus_.get(), kFreedesktopNotificationsName, |
dbus::ObjectPath(kFreedesktopNotificationsPath)); |
EXPECT_CALL(*mock_bus_.get(), |
GetObjectProxy(kFreedesktopNotificationsName, |
dbus::ObjectPath(kFreedesktopNotificationsPath))) |
- .WillOnce(testing::Return(mock_notification_proxy_.get())); |
+ .WillOnce(Return(mock_notification_proxy_.get())); |
EXPECT_CALL(*mock_notification_proxy_.get(), |
- MockCallMethodAndBlock(testing::_, testing::_)) |
+ MockCallMethodAndBlock(Calls("GetCapabilities"), _)) |
.WillOnce(OnGetCapabilities(std::vector<std::string>())); |
- EXPECT_CALL(*mock_notification_proxy_.get(), |
- ConnectToSignal(kFreedesktopNotificationsName, "ActionInvoked", |
- testing::_, testing::_)) |
+ EXPECT_CALL( |
+ *mock_notification_proxy_.get(), |
+ ConnectToSignal(kFreedesktopNotificationsName, "ActionInvoked", _, _)) |
.WillOnce(RegisterSignalCallback(&action_invoked_callback_)); |
EXPECT_CALL(*mock_notification_proxy_.get(), |
ConnectToSignal(kFreedesktopNotificationsName, |
- "NotificationClosed", testing::_, testing::_)) |
+ "NotificationClosed", _, _)) |
.WillOnce(RegisterSignalCallback(¬ification_closed_callback_)); |
notification_bridge_linux_ = |
@@ -99,3 +181,17 @@ class NotificationPlatformBridgeLinuxTest : public testing::Test { |
}; |
TEST_F(NotificationPlatformBridgeLinuxTest, SetUpAndTearDown) {} |
+ |
+TEST_F(NotificationPlatformBridgeLinuxTest, NotifyAndCloseFormat) { |
+ EXPECT_CALL(*mock_notification_proxy_.get(), |
+ MockCallMethodAndBlock(Calls("Notify"), _)) |
+ .WillOnce(OnNotify(1)); |
+ notification_bridge_linux_->Display(NotificationCommon::PERSISTENT, "", "", |
+ false, |
+ CreateNotification("id1", "", "", "")); |
+ |
+ EXPECT_CALL(*mock_notification_proxy_.get(), |
+ MockCallMethodAndBlock(Calls("CloseNotification"), _)) |
+ .WillOnce(OnCloseNotification()); |
+ notification_bridge_linux_->Close("", ""); |
+} |