| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "remoting/protocol/connection_to_client.h" |
| |
| #include "base/bind.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/message_loop/message_loop_proxy.h" |
| #include "remoting/base/constants.h" |
| #include "remoting/protocol/fake_session.h" |
| #include "remoting/protocol/protocol_mock_objects.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| |
| using ::testing::_; |
| using ::testing::NotNull; |
| using ::testing::StrictMock; |
| |
| namespace remoting { |
| namespace protocol { |
| |
| class ConnectionToClientTest : public testing::Test { |
| public: |
| ConnectionToClientTest() { |
| } |
| |
| protected: |
| virtual void SetUp() OVERRIDE { |
| session_ = new FakeSession(); |
| |
| // Allocate a ClientConnection object with the mock objects. |
| viewer_.reset(new ConnectionToClient(session_)); |
| viewer_->set_clipboard_stub(&clipboard_stub_); |
| viewer_->set_host_stub(&host_stub_); |
| viewer_->set_input_stub(&input_stub_); |
| viewer_->SetEventHandler(&handler_); |
| EXPECT_CALL(handler_, OnConnectionAuthenticated(viewer_.get())); |
| EXPECT_CALL(handler_, OnConnectionChannelsConnected(viewer_.get())); |
| session_->event_handler()->OnSessionStateChange(Session::CONNECTED); |
| session_->event_handler()->OnSessionStateChange(Session::AUTHENTICATED); |
| message_loop_.RunUntilIdle(); |
| } |
| |
| virtual void TearDown() OVERRIDE { |
| viewer_.reset(); |
| message_loop_.RunUntilIdle(); |
| } |
| |
| base::MessageLoop message_loop_; |
| MockConnectionToClientEventHandler handler_; |
| MockClipboardStub clipboard_stub_; |
| MockHostStub host_stub_; |
| MockInputStub input_stub_; |
| scoped_ptr<ConnectionToClient> viewer_; |
| |
| // Owned by |viewer_|. |
| FakeSession* session_; |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(ConnectionToClientTest); |
| }; |
| |
| TEST_F(ConnectionToClientTest, SendUpdateStream) { |
| scoped_ptr<VideoPacket> packet(new VideoPacket()); |
| viewer_->video_stub()->ProcessVideoPacket(packet.Pass(), base::Closure()); |
| |
| message_loop_.RunUntilIdle(); |
| |
| // Verify that something has been written. |
| // TODO(sergeyu): Verify that the correct data has been written. |
| ASSERT_TRUE(session_->GetStreamChannel(kVideoChannelName)); |
| EXPECT_GT(session_->GetStreamChannel(kVideoChannelName)-> |
| written_data().size(), 0u); |
| |
| // And then close the connection to ConnectionToClient. |
| viewer_->Disconnect(); |
| |
| message_loop_.RunUntilIdle(); |
| } |
| |
| TEST_F(ConnectionToClientTest, NoWriteAfterDisconnect) { |
| scoped_ptr<VideoPacket> packet(new VideoPacket()); |
| viewer_->video_stub()->ProcessVideoPacket(packet.Pass(), base::Closure()); |
| |
| // And then close the connection to ConnectionToClient. |
| viewer_->Disconnect(); |
| |
| // The test will crash if data writer tries to write data to the |
| // channel socket. |
| // TODO(sergeyu): Use MockSession to verify that no data is written? |
| message_loop_.RunUntilIdle(); |
| } |
| |
| TEST_F(ConnectionToClientTest, StateChange) { |
| EXPECT_CALL(handler_, OnConnectionClosed(viewer_.get(), OK)); |
| session_->event_handler()->OnSessionStateChange(Session::CLOSED); |
| message_loop_.RunUntilIdle(); |
| |
| EXPECT_CALL(handler_, OnConnectionClosed(viewer_.get(), SESSION_REJECTED)); |
| session_->set_error(SESSION_REJECTED); |
| session_->event_handler()->OnSessionStateChange(Session::FAILED); |
| message_loop_.RunUntilIdle(); |
| } |
| |
| } // namespace protocol |
| } // namespace remoting |