1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "remoting/client/client_status_logger.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/message_loop/message_loop.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/message_loop/message_loop_proxy.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "remoting/client/chromoting_stats.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "remoting/signaling/mock_signal_strategy.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "remoting/signaling/server_log_entry_unittest.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "testing/gmock/include/gmock/gmock.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/webrtc/libjingle/xmllite/xmlelement.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing buzz::XmlElement;
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing buzz::QName;
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing remoting::protocol::ConnectionToHost;
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing testing::_;
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing testing::DeleteArg;
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing testing::InSequence;
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing testing::Return;
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace remoting {
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
28116680a4aac90f2aa7413d9095a592090648e557Ben MurdochACTION_P(QuitMainMessageLoop, message_loop) {
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure());
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kTestBotJid[] = "remotingunittest@bot.talk.google.com";
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kClientJid[] = "host@domain.com/1234";
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
35116680a4aac90f2aa7413d9095a592090648e557Ben MurdochMATCHER_P2(IsStateChange, new_state, error, "") {
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  XmlElement* entry = GetSingleLogEntryFromStanza(arg);
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!entry) {
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool is_state_change = (
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      entry->Attr(QName(std::string(), "event-name")) == "session-state" &&
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      entry->Attr(QName(std::string(), "session-state")) == new_state &&
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      entry->Attr(QName(std::string(), "role")) == "client" &&
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      entry->Attr(QName(std::string(), "mode")) == "me2me");
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!std::string(error).empty()) {
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    is_state_change = is_state_change &&
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        entry->Attr(QName(std::string(), "connection-error")) == error;
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return is_state_change;
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
53116680a4aac90f2aa7413d9095a592090648e557Ben MurdochMATCHER(IsStatisticsLog, "") {
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  XmlElement* entry = GetSingleLogEntryFromStanza(arg);
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!entry) {
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return entry->Attr(QName(std::string(), "event-name")) ==
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "connection-statistics";
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ClientStatusLoggerTest : public testing::Test {
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ClientStatusLoggerTest() {}
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetUp() OVERRIDE {
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(signal_strategy_, AddListener(_));
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(signal_strategy_, RemoveListener(_));
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    message_loop_proxy_ = base::MessageLoopProxy::current();
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    client_status_logger_.reset(
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new ClientStatusLogger(ServerLogEntry::ME2ME,
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               &signal_strategy_,
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               kTestBotJid));
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected:
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::MessageLoop message_loop_;
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockSignalStrategy signal_strategy_;
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<ClientStatusLogger> client_status_logger_;
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
85116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ClientStatusLoggerTest, LogStateChange) {
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    InSequence s;
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(signal_strategy_, GetLocalJid())
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .WillRepeatedly(Return(kClientJid));
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(signal_strategy_, AddListener(_));
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(signal_strategy_, GetNextId());
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(signal_strategy_, SendStanzaPtr(
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        IsStateChange("connected", std::string())))
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(signal_strategy_, RemoveListener(_))
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .WillOnce(QuitMainMessageLoop(&message_loop_))
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .RetiresOnSaturation();
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  client_status_logger_->LogSessionStateChange(ConnectionToHost::CONNECTED,
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                               protocol::OK);
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Setting the state to CONNECTED causes the log to be sent. Setting the
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // state to DISCONNECTED causes |signal_strategy_| to be cleaned up,
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // which removes the listener and terminates the test.
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  client_status_logger_->SetSignalingStateForTest(SignalStrategy::CONNECTED);
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  client_status_logger_->SetSignalingStateForTest(SignalStrategy::DISCONNECTED);
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  message_loop_.Run();
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
110116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ClientStatusLoggerTest, LogStateChangeError) {
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    InSequence s;
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(signal_strategy_, GetLocalJid())
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .WillRepeatedly(Return(kClientJid));
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(signal_strategy_, AddListener(_));
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(signal_strategy_, GetNextId());
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(signal_strategy_, SendStanzaPtr(
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        IsStateChange("connection-failed", "host-is-offline")))
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(signal_strategy_, RemoveListener(_))
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .WillOnce(QuitMainMessageLoop(&message_loop_))
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .RetiresOnSaturation();
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  client_status_logger_->LogSessionStateChange(ConnectionToHost::FAILED,
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                               protocol::PEER_IS_OFFLINE);
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  client_status_logger_->SetSignalingStateForTest(SignalStrategy::CONNECTED);
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  client_status_logger_->SetSignalingStateForTest(SignalStrategy::DISCONNECTED);
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  message_loop_.Run();
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
132116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ClientStatusLoggerTest, LogStatistics) {
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    InSequence s;
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(signal_strategy_, GetLocalJid())
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .WillRepeatedly(Return(kClientJid));
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(signal_strategy_, AddListener(_));
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(signal_strategy_, GetNextId());
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(signal_strategy_, SendStanzaPtr(
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        IsStatisticsLog()))
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(signal_strategy_, RemoveListener(_))
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .WillOnce(QuitMainMessageLoop(&message_loop_))
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .RetiresOnSaturation();
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ChromotingStats stats;
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  client_status_logger_->LogStatistics(&stats);
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  client_status_logger_->SetSignalingStateForTest(SignalStrategy::CONNECTED);
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  client_status_logger_->SetSignalingStateForTest(SignalStrategy::DISCONNECTED);
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  message_loop_.Run();
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace remoting
156