| Index: remoting/host/client_session_unittest.cc
 | 
| diff --git a/remoting/host/client_session_unittest.cc b/remoting/host/client_session_unittest.cc
 | 
| index bc41d67c94c71754c485e3f21557a9083158847d..e9f15f80a694d48be4a867f631f29a23bf1c51dc 100644
 | 
| --- a/remoting/host/client_session_unittest.cc
 | 
| +++ b/remoting/host/client_session_unittest.cc
 | 
| @@ -3,8 +3,11 @@
 | 
|  // found in the LICENSE file.
 | 
|  
 | 
|  #include "base/message_loop.h"
 | 
| +#include "remoting/base/auto_thread_task_runner.h"
 | 
|  #include "remoting/base/constants.h"
 | 
| +#include "remoting/host/audio_capturer.h"
 | 
|  #include "remoting/host/client_session.h"
 | 
| +#include "remoting/host/desktop_environment.h"
 | 
|  #include "remoting/host/host_mock_objects.h"
 | 
|  #include "remoting/protocol/protocol_mock_objects.h"
 | 
|  #include "testing/gtest/include/gtest/gtest.h"
 | 
| @@ -17,8 +20,10 @@ using protocol::MockConnectionToClientEventHandler;
 | 
|  using protocol::MockHostStub;
 | 
|  using protocol::MockInputStub;
 | 
|  using protocol::MockSession;
 | 
| +using protocol::SessionConfig;
 | 
|  
 | 
|  using testing::_;
 | 
| +using testing::AnyNumber;
 | 
|  using testing::DeleteArg;
 | 
|  using testing::InSequence;
 | 
|  using testing::Return;
 | 
| @@ -29,31 +34,76 @@ class ClientSessionTest : public testing::Test {
 | 
|    ClientSessionTest() {}
 | 
|  
 | 
|    virtual void SetUp() OVERRIDE {
 | 
| +    ui_task_runner_ = new AutoThreadTaskRunner(
 | 
| +        message_loop_.message_loop_proxy(),
 | 
| +        base::Bind(&ClientSessionTest::QuitMainMessageLoop,
 | 
| +                   base::Unretained(this)));
 | 
| +
 | 
| +    EXPECT_CALL(context_, ui_task_runner())
 | 
| +        .Times(AnyNumber())
 | 
| +        .WillRepeatedly(Return(ui_task_runner_.get()));
 | 
| +    EXPECT_CALL(context_, capture_task_runner())
 | 
| +        .Times(AnyNumber())
 | 
| +        .WillRepeatedly(Return(ui_task_runner_.get()));
 | 
| +    EXPECT_CALL(context_, encode_task_runner())
 | 
| +        .Times(AnyNumber())
 | 
| +        .WillRepeatedly(Return(ui_task_runner_.get()));
 | 
| +    EXPECT_CALL(context_, network_task_runner())
 | 
| +        .Times(AnyNumber())
 | 
| +        .WillRepeatedly(Return(ui_task_runner_.get()));
 | 
| +
 | 
|      client_jid_ = "user@domain/rest-of-jid";
 | 
|  
 | 
| +    event_executor_ = new MockEventExecutor();
 | 
| +    capturer_ = new MockVideoFrameCapturer();
 | 
| +    EXPECT_CALL(*capturer_, Start(_));
 | 
| +    EXPECT_CALL(*capturer_, Stop());
 | 
| +    EXPECT_CALL(*capturer_, InvalidateRegion(_)).Times(AnyNumber());
 | 
| +    EXPECT_CALL(*capturer_, CaptureInvalidRegion(_)).Times(AnyNumber());
 | 
| +
 | 
| +    scoped_ptr<DesktopEnvironment> desktop_environment(new DesktopEnvironment(
 | 
| +        scoped_ptr<AudioCapturer>(NULL),
 | 
| +        scoped_ptr<EventExecutor>(event_executor_),
 | 
| +        scoped_ptr<VideoFrameCapturer>(capturer_)));
 | 
| +
 | 
|      // Set up a large default screen size that won't affect most tests.
 | 
|      default_screen_size_.set(1000, 1000);
 | 
| -    EXPECT_CALL(capturer_, size_most_recent())
 | 
| +    EXPECT_CALL(*capturer_, size_most_recent())
 | 
|          .WillRepeatedly(ReturnRef(default_screen_size_));
 | 
|  
 | 
| +    session_config_ = SessionConfig::GetDefault();
 | 
| +
 | 
|      protocol::MockSession* session = new MockSession();
 | 
| +    EXPECT_CALL(*session, config()).WillRepeatedly(ReturnRef(session_config_));
 | 
|      EXPECT_CALL(*session, jid()).WillRepeatedly(ReturnRef(client_jid_));
 | 
|      EXPECT_CALL(*session, SetEventHandler(_));
 | 
|      EXPECT_CALL(*session, Close());
 | 
|      scoped_ptr<protocol::ConnectionToClient> connection(
 | 
|          new protocol::ConnectionToClient(session));
 | 
|      connection_ = connection.get();
 | 
| -    client_session_.reset(new ClientSession(
 | 
| -        &session_event_handler_, connection.Pass(),
 | 
| -        &host_clipboard_stub_, &host_input_stub_, &capturer_,
 | 
| -        base::TimeDelta()));
 | 
| +
 | 
| +    client_session_ = new ClientSession(
 | 
| +        &session_event_handler_,
 | 
| +        context_.capture_task_runner(),
 | 
| +        context_.encode_task_runner(),
 | 
| +        context_.network_task_runner(),
 | 
| +        connection.Pass(),
 | 
| +        desktop_environment.Pass(),
 | 
| +        base::TimeDelta());
 | 
|    }
 | 
|  
 | 
|    virtual void TearDown() OVERRIDE {
 | 
| -    client_session_.reset();
 | 
| -    // Run message loop before destroying because protocol::Session is
 | 
| -    // destroyed asynchronously.
 | 
| -    message_loop_.RunAllPending();
 | 
| +    // MockClientSessionEventHandler won't trigger StopAndDelete, so fake it.
 | 
| +    client_session_->Stop(base::Bind(
 | 
| +        &ClientSessionTest::OnClientStopped, base::Unretained(this)));
 | 
| +
 | 
| +    // Run message loop before destroying because the session is destroyed
 | 
| +    // asynchronously.
 | 
| +    ui_task_runner_ = NULL;
 | 
| +    message_loop_.Run();
 | 
| +
 | 
| +    // Verify that the client session has been stopped.
 | 
| +    EXPECT_TRUE(client_session_.get() == NULL);
 | 
|    }
 | 
|  
 | 
|   protected:
 | 
| @@ -64,15 +114,25 @@ class ClientSessionTest : public testing::Test {
 | 
|                                          protocol::OK);
 | 
|    }
 | 
|  
 | 
| -  SkISize default_screen_size_;
 | 
| +  void QuitMainMessageLoop() {
 | 
| +    message_loop_.PostTask(FROM_HERE, MessageLoop::QuitClosure());
 | 
| +  }
 | 
| +
 | 
| +  void OnClientStopped() {
 | 
| +    client_session_ = NULL;
 | 
| +  }
 | 
| +
 | 
|    MessageLoop message_loop_;
 | 
| +  scoped_refptr<AutoThreadTaskRunner> ui_task_runner_;
 | 
| +  MockChromotingHostContext context_;
 | 
| +  SkISize default_screen_size_;
 | 
|    std::string client_jid_;
 | 
|    MockHostStub host_stub_;
 | 
| -  MockClipboardStub host_clipboard_stub_;
 | 
| -  MockInputStub host_input_stub_;
 | 
| -  MockVideoFrameCapturer capturer_;
 | 
| +  MockEventExecutor* event_executor_;
 | 
| +  MockVideoFrameCapturer* capturer_;
 | 
|    MockClientSessionEventHandler session_event_handler_;
 | 
| -  scoped_ptr<ClientSession> client_session_;
 | 
| +  scoped_refptr<ClientSession> client_session_;
 | 
| +  SessionConfig session_config_;
 | 
|  
 | 
|    // ClientSession owns |connection_| but tests need it to inject fake events.
 | 
|    protocol::ConnectionToClient* connection_;
 | 
| @@ -98,10 +158,12 @@ TEST_F(ClientSessionTest, ClipboardStubFilter) {
 | 
|  
 | 
|    InSequence s;
 | 
|    EXPECT_CALL(session_event_handler_, OnSessionAuthenticated(_));
 | 
| +  EXPECT_CALL(*event_executor_, StartPtr(_));
 | 
|    EXPECT_CALL(session_event_handler_, OnSessionChannelsConnected(_));
 | 
| -  EXPECT_CALL(host_clipboard_stub_, InjectClipboardEvent(EqualsClipboardEvent(
 | 
| +  EXPECT_CALL(*event_executor_, InjectClipboardEvent(EqualsClipboardEvent(
 | 
|        kMimeTypeTextUtf8, "b")));
 | 
|    EXPECT_CALL(session_event_handler_, OnSessionClosed(_));
 | 
| +  EXPECT_CALL(*event_executor_, StopAndDeleteMock());
 | 
|  
 | 
|    // This event should not get through to the clipboard stub,
 | 
|    // because the client isn't authenticated yet.
 | 
| @@ -160,11 +222,13 @@ TEST_F(ClientSessionTest, InputStubFilter) {
 | 
|  
 | 
|    InSequence s;
 | 
|    EXPECT_CALL(session_event_handler_, OnSessionAuthenticated(_));
 | 
| +  EXPECT_CALL(*event_executor_, StartPtr(_));
 | 
|    EXPECT_CALL(session_event_handler_, OnSessionChannelsConnected(_));
 | 
| -  EXPECT_CALL(host_input_stub_, InjectKeyEvent(EqualsUsbEvent(2, true)));
 | 
| -  EXPECT_CALL(host_input_stub_, InjectKeyEvent(EqualsUsbEvent(2, false)));
 | 
| -  EXPECT_CALL(host_input_stub_, InjectMouseEvent(EqualsMouseEvent(200, 201)));
 | 
| +  EXPECT_CALL(*event_executor_, InjectKeyEvent(EqualsUsbEvent(2, true)));
 | 
| +  EXPECT_CALL(*event_executor_, InjectKeyEvent(EqualsUsbEvent(2, false)));
 | 
| +  EXPECT_CALL(*event_executor_, InjectMouseEvent(EqualsMouseEvent(200, 201)));
 | 
|    EXPECT_CALL(session_event_handler_, OnSessionClosed(_));
 | 
| +  EXPECT_CALL(*event_executor_, StopAndDeleteMock());
 | 
|  
 | 
|    // These events should not get through to the input stub,
 | 
|    // because the client isn't authenticated yet.
 | 
| @@ -196,10 +260,12 @@ TEST_F(ClientSessionTest, LocalInputTest) {
 | 
|  
 | 
|    InSequence s;
 | 
|    EXPECT_CALL(session_event_handler_, OnSessionAuthenticated(_));
 | 
| +  EXPECT_CALL(*event_executor_, StartPtr(_));
 | 
|    EXPECT_CALL(session_event_handler_, OnSessionChannelsConnected(_));
 | 
| -  EXPECT_CALL(host_input_stub_, InjectMouseEvent(EqualsMouseEvent(100, 101)));
 | 
| -  EXPECT_CALL(host_input_stub_, InjectMouseEvent(EqualsMouseEvent(200, 201)));
 | 
| +  EXPECT_CALL(*event_executor_, InjectMouseEvent(EqualsMouseEvent(100, 101)));
 | 
| +  EXPECT_CALL(*event_executor_, InjectMouseEvent(EqualsMouseEvent(200, 201)));
 | 
|    EXPECT_CALL(session_event_handler_, OnSessionClosed(_));
 | 
| +  EXPECT_CALL(*event_executor_, StopAndDeleteMock());
 | 
|  
 | 
|    client_session_->OnConnectionAuthenticated(client_session_->connection());
 | 
|    client_session_->OnConnectionChannelsConnected(client_session_->connection());
 | 
| @@ -233,16 +299,18 @@ TEST_F(ClientSessionTest, RestoreEventState) {
 | 
|  
 | 
|    InSequence s;
 | 
|    EXPECT_CALL(session_event_handler_, OnSessionAuthenticated(_));
 | 
| +  EXPECT_CALL(*event_executor_, StartPtr(_));
 | 
|    EXPECT_CALL(session_event_handler_, OnSessionChannelsConnected(_));
 | 
| -  EXPECT_CALL(host_input_stub_, InjectKeyEvent(EqualsUsbEvent(1, true)));
 | 
| -  EXPECT_CALL(host_input_stub_, InjectKeyEvent(EqualsUsbEvent(2, true)));
 | 
| -  EXPECT_CALL(host_input_stub_, InjectMouseEvent(EqualsMouseButtonEvent(
 | 
| +  EXPECT_CALL(*event_executor_, InjectKeyEvent(EqualsUsbEvent(1, true)));
 | 
| +  EXPECT_CALL(*event_executor_, InjectKeyEvent(EqualsUsbEvent(2, true)));
 | 
| +  EXPECT_CALL(*event_executor_, InjectMouseEvent(EqualsMouseButtonEvent(
 | 
|        protocol::MouseEvent::BUTTON_LEFT, true)));
 | 
| -  EXPECT_CALL(host_input_stub_, InjectKeyEvent(EqualsUsbEvent(1, false)));
 | 
| -  EXPECT_CALL(host_input_stub_, InjectKeyEvent(EqualsUsbEvent(2, false)));
 | 
| -  EXPECT_CALL(host_input_stub_, InjectMouseEvent(EqualsMouseButtonEvent(
 | 
| +  EXPECT_CALL(*event_executor_, InjectKeyEvent(EqualsUsbEvent(1, false)));
 | 
| +  EXPECT_CALL(*event_executor_, InjectKeyEvent(EqualsUsbEvent(2, false)));
 | 
| +  EXPECT_CALL(*event_executor_, InjectMouseEvent(EqualsMouseButtonEvent(
 | 
|        protocol::MouseEvent::BUTTON_LEFT, false)));
 | 
|    EXPECT_CALL(session_event_handler_, OnSessionClosed(_));
 | 
| +  EXPECT_CALL(*event_executor_, StopAndDeleteMock());
 | 
|  
 | 
|    client_session_->OnConnectionAuthenticated(client_session_->connection());
 | 
|    client_session_->OnConnectionChannelsConnected(client_session_->connection());
 | 
| @@ -256,12 +324,14 @@ TEST_F(ClientSessionTest, RestoreEventState) {
 | 
|  
 | 
|  TEST_F(ClientSessionTest, ClampMouseEvents) {
 | 
|    SkISize screen(SkISize::Make(200, 100));
 | 
| -  EXPECT_CALL(capturer_, size_most_recent())
 | 
| +  EXPECT_CALL(*capturer_, size_most_recent())
 | 
|        .WillRepeatedly(ReturnRef(screen));
 | 
|  
 | 
|    EXPECT_CALL(session_event_handler_, OnSessionAuthenticated(_));
 | 
| +  EXPECT_CALL(*event_executor_, StartPtr(_));
 | 
|    EXPECT_CALL(session_event_handler_, OnSessionChannelsConnected(_));
 | 
|    EXPECT_CALL(session_event_handler_, OnSessionClosed(_));
 | 
| +  EXPECT_CALL(*event_executor_, StopAndDeleteMock());
 | 
|  
 | 
|    client_session_->OnConnectionAuthenticated(client_session_->connection());
 | 
|    client_session_->OnConnectionChannelsConnected(client_session_->connection());
 | 
| @@ -276,7 +346,7 @@ TEST_F(ClientSessionTest, ClampMouseEvents) {
 | 
|      for (int i = 0; i < 3; i++) {
 | 
|        event.set_x(input_x[i]);
 | 
|        event.set_y(input_y[j]);
 | 
| -      EXPECT_CALL(host_input_stub_, InjectMouseEvent(EqualsMouseEvent(
 | 
| +      EXPECT_CALL(*event_executor_, InjectMouseEvent(EqualsMouseEvent(
 | 
|            expected_x[i], expected_y[j])));
 | 
|        connection_->input_stub()->InjectMouseEvent(event);
 | 
|      }
 | 
| 
 |