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); |
} |