1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "remoting/protocol/connection_to_client.h" 6 7#include "base/bind.h" 8#include "base/message_loop/message_loop.h" 9#include "base/message_loop/message_loop_proxy.h" 10#include "remoting/base/constants.h" 11#include "remoting/protocol/fake_session.h" 12#include "remoting/protocol/protocol_mock_objects.h" 13#include "testing/gmock/include/gmock/gmock.h" 14 15using ::testing::_; 16using ::testing::NotNull; 17using ::testing::StrictMock; 18 19namespace remoting { 20namespace protocol { 21 22class ConnectionToClientTest : public testing::Test { 23 public: 24 ConnectionToClientTest() { 25 } 26 27 protected: 28 virtual void SetUp() OVERRIDE { 29 session_ = new FakeSession(); 30 31 // Allocate a ClientConnection object with the mock objects. 32 viewer_.reset(new ConnectionToClient(session_)); 33 viewer_->set_clipboard_stub(&clipboard_stub_); 34 viewer_->set_host_stub(&host_stub_); 35 viewer_->set_input_stub(&input_stub_); 36 viewer_->SetEventHandler(&handler_); 37 EXPECT_CALL(handler_, OnConnectionAuthenticated(viewer_.get())); 38 EXPECT_CALL(handler_, OnConnectionChannelsConnected(viewer_.get())); 39 session_->event_handler()->OnSessionStateChange(Session::CONNECTED); 40 session_->event_handler()->OnSessionStateChange(Session::AUTHENTICATED); 41 message_loop_.RunUntilIdle(); 42 } 43 44 virtual void TearDown() OVERRIDE { 45 viewer_.reset(); 46 message_loop_.RunUntilIdle(); 47 } 48 49 base::MessageLoop message_loop_; 50 MockConnectionToClientEventHandler handler_; 51 MockClipboardStub clipboard_stub_; 52 MockHostStub host_stub_; 53 MockInputStub input_stub_; 54 scoped_ptr<ConnectionToClient> viewer_; 55 56 // Owned by |viewer_|. 57 FakeSession* session_; 58 59 private: 60 DISALLOW_COPY_AND_ASSIGN(ConnectionToClientTest); 61}; 62 63TEST_F(ConnectionToClientTest, SendUpdateStream) { 64 scoped_ptr<VideoPacket> packet(new VideoPacket()); 65 viewer_->video_stub()->ProcessVideoPacket(packet.Pass(), base::Closure()); 66 67 message_loop_.RunUntilIdle(); 68 69 // Verify that something has been written. 70 // TODO(sergeyu): Verify that the correct data has been written. 71 ASSERT_TRUE(session_->GetStreamChannel(kVideoChannelName)); 72 EXPECT_GT(session_->GetStreamChannel(kVideoChannelName)-> 73 written_data().size(), 0u); 74 75 // And then close the connection to ConnectionToClient. 76 viewer_->Disconnect(); 77 78 message_loop_.RunUntilIdle(); 79} 80 81TEST_F(ConnectionToClientTest, NoWriteAfterDisconnect) { 82 scoped_ptr<VideoPacket> packet(new VideoPacket()); 83 viewer_->video_stub()->ProcessVideoPacket(packet.Pass(), base::Closure()); 84 85 // And then close the connection to ConnectionToClient. 86 viewer_->Disconnect(); 87 88 // The test will crash if data writer tries to write data to the 89 // channel socket. 90 // TODO(sergeyu): Use MockSession to verify that no data is written? 91 message_loop_.RunUntilIdle(); 92} 93 94TEST_F(ConnectionToClientTest, StateChange) { 95 EXPECT_CALL(handler_, OnConnectionClosed(viewer_.get(), OK)); 96 session_->event_handler()->OnSessionStateChange(Session::CLOSED); 97 message_loop_.RunUntilIdle(); 98 99 EXPECT_CALL(handler_, OnConnectionClosed(viewer_.get(), SESSION_REJECTED)); 100 session_->set_error(SESSION_REJECTED); 101 session_->event_handler()->OnSessionStateChange(Session::FAILED); 102 message_loop_.RunUntilIdle(); 103} 104 105} // namespace protocol 106} // namespace remoting 107