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