Home | History | Annotate | Download | only in protocol
      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:
     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 
     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 
     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 
     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