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