15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// found in the LICENSE file. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "remoting/protocol/connection_to_client.h" 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/bind.h" 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/message_loop/message_loop.h" 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/run_loop.h" 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "remoting/base/constants.h" 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "remoting/protocol/fake_session.h" 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "remoting/protocol/protocol_mock_objects.h" 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using ::testing::_; 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using ::testing::NotNull; 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using ::testing::StrictMock; 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace remoting { 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace protocol { 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ConnectionToClientTest : public testing::Test { 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ConnectionToClientTest() { 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) protected: 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void SetUp() OVERRIDE { 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) session_ = new FakeSession(); 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Allocate a ClientConnection object with the mock objects. 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) viewer_.reset(new ConnectionToClient(session_)); 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) viewer_->set_clipboard_stub(&clipboard_stub_); 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) viewer_->set_host_stub(&host_stub_); 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) viewer_->set_input_stub(&input_stub_); 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) viewer_->SetEventHandler(&handler_); 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_CALL(handler_, OnConnectionAuthenticated(viewer_.get())); 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_CALL(handler_, OnConnectionChannelsConnected(viewer_.get())); 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) session_->event_handler()->OnSessionStateChange(Session::CONNECTED); 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) session_->event_handler()->OnSessionStateChange(Session::AUTHENTICATED); 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void TearDown() OVERRIDE { 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) viewer_.reset(); 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) base::MessageLoop message_loop_; 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MockConnectionToClientEventHandler handler_; 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MockClipboardStub clipboard_stub_; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MockHostStub host_stub_; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MockInputStub input_stub_; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scoped_ptr<ConnectionToClient> viewer_; 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Owned by |viewer_|. 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FakeSession* session_; 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private: 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ConnectionToClientTest); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(ConnectionToClientTest, SendUpdateStream) { 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scoped_ptr<VideoPacket> packet(new VideoPacket()); 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) viewer_->video_stub()->ProcessVideoPacket(packet.Pass(), base::Closure()); 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Verify that something has been written. 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // TODO(sergeyu): Verify that the correct data has been written. 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_TRUE( 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) session_->fake_channel_factory().GetFakeChannel(kVideoChannelName)); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_FALSE(session_->fake_channel_factory() 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .GetFakeChannel(kVideoChannelName)->written_data().empty()); 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // And then close the connection to ConnectionToClient. 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) viewer_->Disconnect(); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(ConnectionToClientTest, NoWriteAfterDisconnect) { 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scoped_ptr<VideoPacket> packet(new VideoPacket()); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) viewer_->video_stub()->ProcessVideoPacket(packet.Pass(), base::Closure()); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // And then close the connection to ConnectionToClient. 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) viewer_->Disconnect(); 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The test will crash if data writer tries to write data to the 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // channel socket. 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // TODO(sergeyu): Use MockSession to verify that no data is written? 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 96TEST_F(ConnectionToClientTest, StateChange) { 97 EXPECT_CALL(handler_, OnConnectionClosed(viewer_.get(), OK)); 98 session_->event_handler()->OnSessionStateChange(Session::CLOSED); 99 base::RunLoop().RunUntilIdle(); 100 101 EXPECT_CALL(handler_, OnConnectionClosed(viewer_.get(), SESSION_REJECTED)); 102 session_->set_error(SESSION_REJECTED); 103 session_->event_handler()->OnSessionStateChange(Session::FAILED); 104 base::RunLoop().RunUntilIdle(); 105} 106 107} // namespace protocol 108} // namespace remoting 109