1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "remoting/host/host_status_logger.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 79ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "remoting/host/fake_host_status_monitor.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "remoting/signaling/mock_signal_strategy.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock_mutant.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/webrtc/libjingle/xmllite/xmlelement.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using buzz::XmlElement; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using buzz::QName; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DeleteArg; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InSequence; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(QuitMainMessageLoop, message_loop) { 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kJabberClientNamespace[] = "jabber:client"; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kChromotingNamespace[] = "google:remoting"; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestBotJid[] = "remotingunittest@bot.talk.google.com"; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kClientJid1[] = "client@domain.com/1234"; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kClientJid2[] = "client@domain.com/5678"; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kHostJid[] = "host@domain.com/1234"; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsLogEntryForConnection(XmlElement* node, const char* connection_type) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (node->Name() == QName(kChromotingNamespace, "entry") && 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) node->Attr(QName(std::string(), "event-name")) == "session-state" && 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) node->Attr(QName(std::string(), "session-state")) == "connected" && 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) node->Attr(QName(std::string(), "role")) == "host" && 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) node->Attr(QName(std::string(), "mode")) == "me2me" && 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) node->Attr(QName(std::string(), "connection-type")) == 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection_type); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(IsClientConnected, connection_type, "") { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (arg->Name() != QName(kJabberClientNamespace, "iq")) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buzz::XmlElement* log_stanza = arg->FirstChild()->AsElement(); 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (log_stanza->Name() != QName(kChromotingNamespace, "log")) { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (log_stanza->NextChild()) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buzz::XmlElement* log_entry = log_stanza->FirstChild()->AsElement(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsLogEntryForConnection(log_entry, connection_type)) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (log_entry->NextChild()) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P2(IsTwoClientsConnected, connection_type1, connection_type2, "") { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (arg->Name() != QName(kJabberClientNamespace, "iq")) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buzz::XmlElement* log_stanza = arg->FirstChild()->AsElement(); 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (log_stanza->Name() != QName(kChromotingNamespace, "log")) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (log_stanza->NextChild()) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buzz::XmlElement* log_entry = log_stanza->FirstChild()->AsElement(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsLogEntryForConnection(log_entry, connection_type1)) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_entry = log_entry->NextChild()->AsElement(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsLogEntryForConnection(log_entry, connection_type2)) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (log_entry->NextChild()) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsLogEntryForDisconnection(XmlElement* node) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (node->Name() == QName(kChromotingNamespace, "entry") && 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) node->Attr(QName(std::string(), "event-name")) == "session-state" && 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) node->Attr(QName(std::string(), "session-state")) == "closed" && 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) node->Attr(QName(std::string(), "role")) == "host" && 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) node->Attr(QName(std::string(), "mode")) == "me2me"); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER(IsClientDisconnected, "") { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (arg->Name() != QName(kJabberClientNamespace, "iq")) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buzz::XmlElement* log_stanza = arg->FirstChild()->AsElement(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (log_stanza->Name() !=QName(kChromotingNamespace, "log")) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (log_stanza->NextChild()) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buzz::XmlElement* log_entry = log_stanza->FirstChild()->AsElement(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsLogEntryForDisconnection(log_entry)) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (log_entry->NextChild()) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass HostStatusLoggerTest : public testing::Test { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch HostStatusLoggerTest() {} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_proxy_ = base::MessageLoopProxy::current(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, AddListener(_)); 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_.reset( 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new HostStatusLogger(host_status_monitor_.AsWeakPtr(), 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ServerLogEntry::ME2ME, 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &signal_strategy_, 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kTestBotJid)); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, RemoveListener(_)); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop message_loop_; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSignalStrategy signal_strategy_; 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<HostStatusLogger> host_status_logger_; 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FakeHostStatusMonitor host_status_monitor_; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 147116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(HostStatusLoggerTest, SendNow) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence s; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, GetLocalJid()) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return(kHostJid)); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, AddListener(_)); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, GetNextId()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, SendStanzaPtr(IsClientConnected("direct"))) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, RemoveListener(_)) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(QuitMainMessageLoop(&message_loop_)) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->SetSignalingStateForTest(SignalStrategy::CONNECTED); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::TransportRoute route; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) route.type = protocol::TransportRoute::DIRECT; 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientRouteChange(kClientJid1, "video", route); 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientAuthenticated(kClientJid1); 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientConnected(kClientJid1); 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->SetSignalingStateForTest( 167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SignalStrategy::DISCONNECTED); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 171116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(HostStatusLoggerTest, SendLater) { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::TransportRoute route; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) route.type = protocol::TransportRoute::DIRECT; 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientRouteChange(kClientJid1, "video", route); 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientAuthenticated(kClientJid1); 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientConnected(kClientJid1); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence s; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, GetLocalJid()) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return(kHostJid)); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, AddListener(_)); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, GetNextId()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, SendStanzaPtr(IsClientConnected("direct"))) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, RemoveListener(_)) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(QuitMainMessageLoop(&message_loop_)) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->SetSignalingStateForTest(SignalStrategy::CONNECTED); 190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->SetSignalingStateForTest(SignalStrategy::DISCONNECTED); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 194116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(HostStatusLoggerTest, SendTwoEntriesLater) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::TransportRoute route1; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) route1.type = protocol::TransportRoute::DIRECT; 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientRouteChange(kClientJid1, "video", route1); 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientAuthenticated(kClientJid1); 199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientConnected(kClientJid1); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::TransportRoute route2; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) route2.type = protocol::TransportRoute::STUN; 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientRouteChange(kClientJid2, "video", route2); 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientAuthenticated(kClientJid2); 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientConnected(kClientJid2); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence s; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, GetLocalJid()) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return(kHostJid)); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, AddListener(_)); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, GetNextId()); 211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(signal_strategy_, 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SendStanzaPtr(IsTwoClientsConnected("direct", "stun"))) 213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, RemoveListener(_)) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(QuitMainMessageLoop(&message_loop_)) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->SetSignalingStateForTest(SignalStrategy::CONNECTED); 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->SetSignalingStateForTest(SignalStrategy::DISCONNECTED); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 223116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(HostStatusLoggerTest, HandleRouteChangeInUnusualOrder) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence s; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, GetLocalJid()) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return(kHostJid)); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, AddListener(_)); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, GetNextId()); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, SendStanzaPtr(IsClientConnected("direct"))) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, GetNextId()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, SendStanzaPtr(IsClientDisconnected())) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, GetNextId()); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, SendStanzaPtr(IsClientConnected("stun"))) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(signal_strategy_, RemoveListener(_)) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(QuitMainMessageLoop(&message_loop_)) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->SetSignalingStateForTest(SignalStrategy::CONNECTED); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::TransportRoute route1; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) route1.type = protocol::TransportRoute::DIRECT; 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientRouteChange(kClientJid1, "video", route1); 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientAuthenticated(kClientJid1); 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientConnected(kClientJid1); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::TransportRoute route2; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) route2.type = protocol::TransportRoute::STUN; 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientRouteChange(kClientJid2, "video", route2); 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientDisconnected(kClientJid1); 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientAuthenticated(kClientJid2); 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->OnClientConnected(kClientJid2); 254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_status_logger_->SetSignalingStateForTest(SignalStrategy::DISCONNECTED); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 259