15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/jingle_session.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/socket.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/stream_socket.h" 13d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/base/constants.h" 15d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "remoting/jingle_glue/chromium_port_allocator.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "remoting/jingle_glue/fake_signal_strategy.h" 17d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "remoting/jingle_glue/network_settings.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/authenticator.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/channel_authenticator.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/connection_tester.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/fake_authenticator.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/jingle_session_manager.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/libjingle_transport_factory.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AtLeast; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AtMost; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DeleteArg; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DoAll; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InSequence; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Invoke; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InvokeWithoutArgs; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::SaveArg; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::SetArgumentPointee; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::WithArg; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protocol { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kHostJid[] = "host1@gmail.com/123"; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kClientJid[] = "host2@gmail.com/321"; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Send 100 messages 1024 bytes each. UDP messages are sent with 10ms delay 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// between messages (about 1 second for 100 messages). 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMessageSize = 1024; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMessages = 100; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kChannelName[] = "test_channel"; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuitCurrentThread() { 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::QuitClosure()); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(QuitThread) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitCurrentThread(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(QuitThreadOnCounter, counter) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --(*counter); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(*counter, 0); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*counter == 0) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitCurrentThread(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockSessionManagerListener : public SessionManager::Listener { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(OnSessionManagerReady, void()); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(OnIncomingSession, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(Session*, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionManager::IncomingSessionResponse*)); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockSessionEventHandler : public Session::EventHandler { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnSessionStateChange, void(Session::State)); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(OnSessionRouteChange, void(const std::string& channel_name, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TransportRoute& route)); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockStreamChannelCallback { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnDone, void(net::StreamSocket* socket)); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class JingleSessionTest : public testing::Test { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JingleSessionTest() { 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_loop_.reset(new base::MessageLoopForIO()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper method that handles OnIncomingSession(). 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetHostSession(Session* session) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(session); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_session_.reset(session); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_session_->SetEventHandler(&host_session_event_handler_); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session->set_config(SessionConfig::ForTest()); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnClientChannelCreated(scoped_ptr<net::StreamSocket> socket) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_channel_callback_.OnDone(socket.get()); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_socket_ = socket.Pass(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnHostChannelCreated(scoped_ptr<net::StreamSocket> socket) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_channel_callback_.OnDone(socket.get()); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_socket_ = socket.Pass(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseSessions(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseSessionManager(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_->RunUntilIdle(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CloseSessions() { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_socket_.reset(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_session_.reset(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_socket_.reset(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_session_.reset(); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateSessionManagers(int auth_round_trips, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeAuthenticator::Action auth_action) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_signal_strategy_.reset(new FakeSignalStrategy(kHostJid)); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_signal_strategy_.reset(new FakeSignalStrategy(kClientJid)); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSignalStrategy::Connect(host_signal_strategy_.get(), 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_signal_strategy_.get()); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_server_listener_, OnSessionManagerReady()) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1); 143d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 144d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) NetworkSettings network_settings(NetworkSettings::NAT_TRAVERSAL_OUTGOING); 145d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 146d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) scoped_ptr<TransportFactory> host_transport(new LibjingleTransportFactory( 147d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) NULL, 148d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) ChromiumPortAllocator::Create(NULL, network_settings) 149d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) .PassAs<cricket::HttpPortAllocatorBase>(), 150d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) network_settings)); 151d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) host_server_.reset(new JingleSessionManager(host_transport.Pass())); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_server_->Init(host_signal_strategy_.get(), &host_server_listener_); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<AuthenticatorFactory> factory( 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new FakeHostAuthenticatorFactory(auth_round_trips, auth_action, true)); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_server_->set_authenticator_factory(factory.Pass()); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(client_server_listener_, OnSessionManagerReady()) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1); 160d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) scoped_ptr<TransportFactory> client_transport(new LibjingleTransportFactory( 161d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) NULL, 162d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) ChromiumPortAllocator::Create(NULL, network_settings) 163d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) .PassAs<cricket::HttpPortAllocatorBase>(), 164d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) network_settings)); 165d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) client_server_.reset( 166d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) new JingleSessionManager(client_transport.Pass())); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_server_->Init(client_signal_strategy_.get(), 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &client_server_listener_); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CloseSessionManager() { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host_server_.get()) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_server_->Close(); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_server_.reset(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (client_server_.get()) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_server_->Close(); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_server_.reset(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_signal_strategy_.reset(); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_signal_strategy_.reset(); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitiateConnection(int auth_round_trips, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeAuthenticator::Action auth_action, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool expect_fail) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_server_listener_, OnIncomingSession(_, _)) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll( 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WithArg<0>(Invoke(this, &JingleSessionTest::SetHostSession)), 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetArgumentPointee<1>(protocol::SessionManager::ACCEPT))); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence dummy; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_session_event_handler_, 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSessionStateChange(Session::CONNECTED)) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AtMost(1)); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expect_fail) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_session_event_handler_, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSessionStateChange(Session::FAILED)) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_session_event_handler_, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSessionStateChange(Session::AUTHENTICATED)) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect that the connection will be closed eventually. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_session_event_handler_, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSessionStateChange(Session::CLOSED)) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AtMost(1)); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence dummy; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(client_session_event_handler_, 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSessionStateChange(Session::CONNECTED)) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AtMost(1)); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expect_fail) { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(client_session_event_handler_, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSessionStateChange(Session::FAILED)) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(client_session_event_handler_, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSessionStateChange(Session::AUTHENTICATED)) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect that the connection will be closed eventually. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(client_session_event_handler_, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSessionStateChange(Session::CLOSED)) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AtMost(1)); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Authenticator> authenticator(new FakeAuthenticator( 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeAuthenticator::CLIENT, auth_round_trips, auth_action, true)); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_session_ = client_server_->Connect( 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kHostJid, authenticator.Pass(), 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CandidateSessionConfig::CreateDefault()); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_session_->SetEventHandler(&client_session_event_handler_); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_->RunUntilIdle(); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateChannel() { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_session_->GetTransportChannelFactory()->CreateStreamChannel( 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kChannelName, base::Bind(&JingleSessionTest::OnClientChannelCreated, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_session_->GetTransportChannelFactory()->CreateStreamChannel( 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kChannelName, base::Bind(&JingleSessionTest::OnHostChannelCreated, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int counter = 2; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRouteChange(kChannelName); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(client_channel_callback_, OnDone(_)) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(QuitThreadOnCounter(&counter)); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_channel_callback_, OnDone(_)) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(QuitThreadOnCounter(&counter)); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_->Run(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client_socket_.get()); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(host_socket_.get()); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectRouteChange(const std::string& channel_name) { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_session_event_handler_, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSessionRouteChange(channel_name, _)) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AtLeast(1)); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(client_session_event_handler_, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSessionRouteChange(channel_name, _)) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AtLeast(1)); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::MessageLoopForIO> message_loop_; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<FakeSignalStrategy> host_signal_strategy_; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<FakeSignalStrategy> client_signal_strategy_; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<JingleSessionManager> host_server_; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSessionManagerListener host_server_listener_; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<JingleSessionManager> client_server_; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSessionManagerListener client_server_listener_; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Session> host_session_; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSessionEventHandler host_session_event_handler_; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Session> client_session_; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSessionEventHandler client_session_event_handler_; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockStreamChannelCallback client_channel_callback_; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockStreamChannelCallback host_channel_callback_; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::StreamSocket> client_socket_; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::StreamSocket> host_socket_; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can create and destroy session managers without a 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// connection. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JingleSessionTest, CreateAndDestoy) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSessionManagers(1, FakeAuthenticator::ACCEPT); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that an incoming session can be rejected, and that the 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// status of the connection is set to FAILED in this case. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JingleSessionTest, RejectConnection) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSessionManagers(1, FakeAuthenticator::ACCEPT); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reject incoming session. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_server_listener_, OnIncomingSession(_, _)) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<1>(protocol::SessionManager::DECLINE)); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence dummy; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(client_session_event_handler_, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSessionStateChange(Session::FAILED)) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Authenticator> authenticator(new FakeAuthenticator( 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeAuthenticator::CLIENT, 1, FakeAuthenticator::ACCEPT, true)); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_session_ = client_server_->Connect( 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kHostJid, authenticator.Pass(), CandidateSessionConfig::CreateDefault()); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_session_->SetEventHandler(&client_session_event_handler_); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_->RunUntilIdle(); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can connect two endpoints with single-step authentication. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JingleSessionTest, Connect) { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSessionManagers(1, FakeAuthenticator::ACCEPT); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitiateConnection(1, FakeAuthenticator::ACCEPT, false); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the client specified correct initiator value. 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_GT(host_signal_strategy_->received_messages().size(), 0U); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const buzz::XmlElement* initiate_xml = 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_signal_strategy_->received_messages().front(); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const buzz::XmlElement* jingle_element = 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initiate_xml->FirstNamed(buzz::QName(kJingleNamespace, "jingle")); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(jingle_element); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(kClientJid, 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) jingle_element->Attr(buzz::QName(std::string(), "initiator"))); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can connect two endpoints with multi-step authentication. 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JingleSessionTest, ConnectWithMultistep) { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSessionManagers(3, FakeAuthenticator::ACCEPT); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitiateConnection(3, FakeAuthenticator::ACCEPT, false); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that connection is terminated when single-step auth fails. 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JingleSessionTest, ConnectWithBadAuth) { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSessionManagers(1, FakeAuthenticator::REJECT); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitiateConnection(1, FakeAuthenticator::ACCEPT, true); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that connection is terminated when multi-step auth fails. 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JingleSessionTest, ConnectWithBadMultistepAuth) { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSessionManagers(3, FakeAuthenticator::REJECT); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitiateConnection(3, FakeAuthenticator::ACCEPT, true); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that data can be sent over stream channel. 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JingleSessionTest, TestStreamChannel) { 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSessionManagers(1, FakeAuthenticator::ACCEPT); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE( 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitiateConnection(1, FakeAuthenticator::ACCEPT, false)); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(CreateChannel()); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StreamConnectionTester tester(host_socket_.get(), client_socket_.get(), 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMessageSize, kMessages); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester.Start(); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_->Run(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester.CheckResults(); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that data can be sent over a multiplexed channel. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JingleSessionTest, TestMuxStreamChannel) { 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSessionManagers(1, FakeAuthenticator::ACCEPT); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE( 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitiateConnection(1, FakeAuthenticator::ACCEPT, false)); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_session_->GetMultiplexedChannelFactory()->CreateStreamChannel( 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kChannelName, base::Bind(&JingleSessionTest::OnClientChannelCreated, 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_session_->GetMultiplexedChannelFactory()->CreateStreamChannel( 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kChannelName, base::Bind(&JingleSessionTest::OnHostChannelCreated, 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int counter = 2; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRouteChange("mux"); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(client_channel_callback_, OnDone(_)) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(QuitThreadOnCounter(&counter)); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_channel_callback_, OnDone(_)) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(QuitThreadOnCounter(&counter)); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_->Run(); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client_socket_.get()); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(host_socket_.get()); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StreamConnectionTester tester(host_socket_.get(), client_socket_.get(), 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMessageSize, kMessages); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester.Start(); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_->Run(); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester.CheckResults(); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can connect channels with multistep auth. 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JingleSessionTest, TestMultistepAuthStreamChannel) { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSessionManagers(3, FakeAuthenticator::ACCEPT); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE( 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitiateConnection(3, FakeAuthenticator::ACCEPT, false)); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(CreateChannel()); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StreamConnectionTester tester(host_socket_.get(), client_socket_.get(), 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMessageSize, kMessages); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester.Start(); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_->Run(); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester.CheckResults(); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we shutdown properly when channel authentication fails. 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JingleSessionTest, TestFailedChannelAuth) { 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSessionManagers(1, FakeAuthenticator::REJECT_CHANNEL); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE( 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitiateConnection(1, FakeAuthenticator::ACCEPT, false)); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_session_->GetTransportChannelFactory()->CreateStreamChannel( 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kChannelName, base::Bind(&JingleSessionTest::OnClientChannelCreated, 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_session_->GetTransportChannelFactory()->CreateStreamChannel( 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kChannelName, base::Bind(&JingleSessionTest::OnHostChannelCreated, 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Terminate the message loop when we get rejection notification 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the host. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_channel_callback_, OnDone(NULL)) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(QuitThread()); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(client_channel_callback_, OnDone(_)) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AtMost(1)); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectRouteChange(kChannelName); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_->Run(); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(!host_socket_.get()); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace protocol 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 451