host_change_notification_listener_unittest.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "remoting/host/host_change_notification_listener.h"
6
7#include <set>
8
9#include "base/bind.h"
10#include "base/memory/ref_counted.h"
11#include "base/message_loop.h"
12#include "base/string_number_conversions.h"
13#include "remoting/base/constants.h"
14#include "remoting/jingle_glue/mock_objects.h"
15#include "testing/gmock/include/gmock/gmock.h"
16#include "testing/gtest/include/gtest/gtest.h"
17#include "third_party/libjingle/source/talk/xmllite/xmlelement.h"
18#include "third_party/libjingle/source/talk/xmpp/constants.h"
19
20using buzz::QName;
21using buzz::XmlElement;
22
23using testing::NotNull;
24using testing::Return;
25
26namespace remoting {
27
28namespace {
29const char kHostId[] = "0";
30const char kTestJid[] = "user@gmail.com/chromoting123";
31const char kTestBotJid[] = "remotingunittest@bot.talk.google.com";
32}  // namespace
33
34ACTION_P(AddListener, list) {
35  list->insert(arg0);
36}
37
38ACTION_P(RemoveListener, list) {
39  EXPECT_TRUE(list->find(arg0) != list->end());
40  list->erase(arg0);
41}
42
43
44class HostChangeNotificationListenerTest : public testing::Test {
45 protected:
46  class MockListener : public HostChangeNotificationListener::Listener {
47   public:
48    MOCK_METHOD0(OnHostDeleted, void());
49  };
50
51  virtual void SetUp() OVERRIDE {
52    EXPECT_CALL(signal_strategy_, AddListener(NotNull()))
53        .WillRepeatedly(AddListener(&signal_strategy_listeners_));
54    EXPECT_CALL(signal_strategy_, RemoveListener(NotNull()))
55        .WillRepeatedly(RemoveListener(&signal_strategy_listeners_));
56    EXPECT_CALL(signal_strategy_, GetLocalJid())
57        .WillRepeatedly(Return(kTestJid));
58
59    host_change_notification_listener_.reset(new HostChangeNotificationListener(
60        &mock_listener_, kHostId, &signal_strategy_, kTestBotJid));
61  }
62
63  virtual void TearDown() OVERRIDE {
64    host_change_notification_listener_.reset();
65    EXPECT_TRUE(signal_strategy_listeners_.empty());
66  }
67
68  scoped_ptr<XmlElement> GetNotificationStanza(std::string operation,
69                                               std::string hostId,
70                                               std::string botJid) {
71    scoped_ptr<XmlElement> stanza(new XmlElement(buzz::QN_IQ));
72    stanza->AddAttr(QName(std::string(), "type"), "set");
73    XmlElement* host_changed =
74        new XmlElement(QName(kChromotingXmlNamespace, "host-changed"));
75    host_changed->AddAttr(QName(kChromotingXmlNamespace, "operation"),
76                          operation);
77    host_changed->AddAttr(QName(kChromotingXmlNamespace, "hostid"), hostId);
78    stanza->AddElement(host_changed);
79    stanza->AddAttr(buzz::QN_FROM, botJid);
80    stanza->AddAttr(buzz::QN_TO, kTestJid);
81    return stanza.Pass();
82  }
83
84  MockListener mock_listener_;
85  MockSignalStrategy signal_strategy_;
86  std::set<SignalStrategy::Listener*> signal_strategy_listeners_;
87  scoped_ptr<HostChangeNotificationListener> host_change_notification_listener_;
88  base::MessageLoop message_loop_;
89};
90
91TEST_F(HostChangeNotificationListenerTest, ReceiveValidNotification) {
92  EXPECT_CALL(mock_listener_, OnHostDeleted())
93      .WillOnce(Return());
94  scoped_ptr<XmlElement> stanza = GetNotificationStanza(
95      "delete", kHostId, kTestBotJid);
96  host_change_notification_listener_->OnSignalStrategyIncomingStanza(
97      stanza.get());
98  message_loop_.PostTask(FROM_HERE,
99                         base::Bind(base::MessageLoop::QuitClosure()));
100  message_loop_.Run();
101}
102
103TEST_F(HostChangeNotificationListenerTest, ReceiveNotificationBeforeDelete) {
104  EXPECT_CALL(mock_listener_, OnHostDeleted())
105      .Times(0);
106  scoped_ptr<XmlElement> stanza = GetNotificationStanza(
107      "delete", kHostId, kTestBotJid);
108  host_change_notification_listener_->OnSignalStrategyIncomingStanza(
109      stanza.get());
110  host_change_notification_listener_.reset();
111  message_loop_.PostTask(FROM_HERE,
112                         base::Bind(base::MessageLoop::QuitClosure()));
113  message_loop_.Run();
114}
115
116
117TEST_F(HostChangeNotificationListenerTest, ReceiveInvalidHostIdNotification) {
118  EXPECT_CALL(mock_listener_, OnHostDeleted())
119      .Times(0);
120  scoped_ptr<XmlElement> stanza = GetNotificationStanza(
121      "delete", "1", kTestBotJid);
122  host_change_notification_listener_->OnSignalStrategyIncomingStanza(
123      stanza.get());
124  message_loop_.PostTask(FROM_HERE,
125                         base::Bind(base::MessageLoop::QuitClosure()));
126  message_loop_.Run();
127}
128
129TEST_F(HostChangeNotificationListenerTest, ReceiveInvalidBotJidNotification) {
130  EXPECT_CALL(mock_listener_, OnHostDeleted())
131      .Times(0);
132  scoped_ptr<XmlElement> stanza = GetNotificationStanza(
133      "delete", kHostId, "notremotingbot@bot.talk.google.com");
134  host_change_notification_listener_->OnSignalStrategyIncomingStanza(
135      stanza.get());
136  message_loop_.PostTask(FROM_HERE,
137                         base::Bind(base::MessageLoop::QuitClosure()));
138  message_loop_.Run();
139}
140
141TEST_F(HostChangeNotificationListenerTest, ReceiveNonDeleteNotification) {
142  EXPECT_CALL(mock_listener_, OnHostDeleted())
143      .Times(0);
144  scoped_ptr<XmlElement> stanza = GetNotificationStanza(
145      "update", kHostId, kTestBotJid);
146  host_change_notification_listener_->OnSignalStrategyIncomingStanza(
147      stanza.get());
148  message_loop_.PostTask(FROM_HERE,
149                         base::Bind(base::MessageLoop::QuitClosure()));
150  message_loop_.Run();
151}
152
153}  // namespace remoting
154