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