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