• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
15 using ::testing::_;
16 using ::testing::NotNull;
17 using ::testing::StrictMock;
18 
19 namespace remoting {
20 namespace protocol {
21 
22 class ConnectionToClientTest : public testing::Test {
23  public:
ConnectionToClientTest()24   ConnectionToClientTest() {
25   }
26 
27  protected:
SetUp()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 
TearDown()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 
TEST_F(ConnectionToClientTest,SendUpdateStream)63 TEST_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 
TEST_F(ConnectionToClientTest,NoWriteAfterDisconnect)81 TEST_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 
TEST_F(ConnectionToClientTest,StateChange)94 TEST_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