Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/scoped_ptr.h" | 6 #include "base/scoped_ptr.h" |
| 7 #include "base/task.h" | 7 #include "base/task.h" |
| 8 #include "remoting/host/capturer_fake.h" | 8 #include "remoting/host/capturer_fake.h" |
| 9 #include "remoting/host/chromoting_host.h" | 9 #include "remoting/host/chromoting_host.h" |
| 10 #include "remoting/host/chromoting_host_context.h" | 10 #include "remoting/host/chromoting_host_context.h" |
| 11 #include "remoting/host/host_mock_objects.h" | 11 #include "remoting/host/host_mock_objects.h" |
| 12 #include "remoting/host/in_memory_host_config.h" | 12 #include "remoting/host/in_memory_host_config.h" |
| 13 #include "remoting/host/user_authenticator_fake.h" | |
| 14 #include "remoting/proto/video.pb.h" | 13 #include "remoting/proto/video.pb.h" |
| 15 #include "remoting/protocol/protocol_mock_objects.h" | 14 #include "remoting/protocol/protocol_mock_objects.h" |
| 16 #include "remoting/protocol/session_config.h" | 15 #include "remoting/protocol/session_config.h" |
| 17 #include "testing/gmock_mutant.h" | 16 #include "testing/gmock_mutant.h" |
| 18 #include "testing/gmock/include/gmock/gmock.h" | 17 #include "testing/gmock/include/gmock/gmock.h" |
| 19 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 20 | 19 |
| 21 using ::remoting::protocol::LocalLoginCredentials; | 20 using ::remoting::protocol::LocalLoginCredentials; |
| 22 using ::remoting::protocol::MockClientStub; | 21 using ::remoting::protocol::MockClientStub; |
| 23 using ::remoting::protocol::MockConnectionToClient; | 22 using ::remoting::protocol::MockConnectionToClient; |
| 24 using ::remoting::protocol::MockConnectionToClientEventHandler; | 23 using ::remoting::protocol::MockConnectionToClientEventHandler; |
| 25 using ::remoting::protocol::MockHostStub; | 24 using ::remoting::protocol::MockHostStub; |
| 26 using ::remoting::protocol::MockInputStub; | |
| 27 using ::remoting::protocol::MockSession; | 25 using ::remoting::protocol::MockSession; |
| 28 using ::remoting::protocol::MockVideoStub; | 26 using ::remoting::protocol::MockVideoStub; |
| 29 using ::remoting::protocol::SessionConfig; | 27 using ::remoting::protocol::SessionConfig; |
| 30 | 28 |
| 31 using testing::_; | 29 using testing::_; |
| 32 using testing::AnyNumber; | 30 using testing::AnyNumber; |
| 33 using testing::AtLeast; | 31 using testing::AtLeast; |
| 34 using testing::CreateFunctor; | 32 using testing::CreateFunctor; |
| 35 using testing::DeleteArg; | 33 using testing::DeleteArg; |
| 36 using testing::DoAll; | 34 using testing::DoAll; |
| 37 using testing::InSequence; | 35 using testing::InSequence; |
| 38 using testing::InvokeWithoutArgs; | 36 using testing::InvokeWithoutArgs; |
| 39 using testing::Return; | 37 using testing::Return; |
| 40 using testing::Sequence; | 38 using testing::Sequence; |
| 41 | 39 |
| 42 namespace remoting { | 40 namespace remoting { |
| 43 | 41 |
| 44 namespace { | 42 namespace { |
| 45 | 43 |
| 46 UserAuthenticator* MakeUserAuthenticator() { | |
| 47 return new UserAuthenticatorFake(); | |
| 48 } | |
| 49 | |
| 50 void PostQuitTask(MessageLoop* message_loop) { | 44 void PostQuitTask(MessageLoop* message_loop) { |
| 51 message_loop->PostTask(FROM_HERE, new MessageLoop::QuitTask()); | 45 message_loop->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
| 52 } | 46 } |
| 53 | 47 |
| 54 // Run the task and delete it afterwards. This action is used to deal with | 48 // Run the task and delete it afterwards. This action is used to deal with |
| 55 // done callbacks. | 49 // done callbacks. |
| 56 ACTION(RunDoneTask) { | 50 ACTION(RunDoneTask) { |
| 57 arg1->Run(); | 51 arg1->Run(); |
| 58 delete arg1; | 52 delete arg1; |
| 59 } | 53 } |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 83 EXPECT_CALL(context_, main_message_loop()) | 77 EXPECT_CALL(context_, main_message_loop()) |
| 84 .Times(AnyNumber()); | 78 .Times(AnyNumber()); |
| 85 EXPECT_CALL(context_, encode_message_loop()) | 79 EXPECT_CALL(context_, encode_message_loop()) |
| 86 .Times(AnyNumber()); | 80 .Times(AnyNumber()); |
| 87 EXPECT_CALL(context_, network_message_loop()) | 81 EXPECT_CALL(context_, network_message_loop()) |
| 88 .Times(AnyNumber()); | 82 .Times(AnyNumber()); |
| 89 | 83 |
| 90 Capturer* capturer = new CapturerFake(); | 84 Capturer* capturer = new CapturerFake(); |
| 91 host_stub_ = new MockHostStub(); | 85 host_stub_ = new MockHostStub(); |
| 92 host_stub2_ = new MockHostStub(); | 86 host_stub2_ = new MockHostStub(); |
| 93 input_stub_ = new MockInputStub(); | 87 event_executor_ = new MockEventExecutor(); |
| 94 input_stub2_ = new MockInputStub(); | 88 event_executor2_ = new MockEventExecutor(); |
| 95 curtain_ = new MockCurtain(); | 89 curtain_ = new MockCurtain(); |
| 90 user_authenticator_ = new MockUserAuthenticator(); | |
| 96 DesktopEnvironment* desktop = | 91 DesktopEnvironment* desktop = |
| 97 new DesktopEnvironment(capturer, input_stub_, curtain_); | 92 new DesktopEnvironment(capturer, event_executor_, curtain_); |
| 98 host_ = ChromotingHost::Create(&context_, config_, desktop); | 93 host_ = ChromotingHost::Create(&context_, config_, desktop); |
| 99 credentials_good_.set_type(protocol::PASSWORD); | 94 credentials_.set_type(protocol::PASSWORD); |
| 100 credentials_good_.set_username("user"); | 95 credentials_.set_username("user"); |
| 101 credentials_good_.set_credential("password"); | 96 credentials_.set_credential("password"); |
| 102 credentials_bad_.set_type(protocol::PASSWORD); | 97 connection_ = new MockConnectionToClient( |
|
Lambros
2011/04/01 15:54:00
Nit: indentation
dmac
2011/04/01 21:15:07
Done.
| |
| 103 credentials_bad_.set_username(UserAuthenticatorFake::fail_username()); | 98 &message_loop_, &handler_, host_stub_, event_executor_); |
| 104 credentials_bad_.set_credential(UserAuthenticatorFake::fail_password()); | |
| 105 connection_ = new MockConnectionToClient( | |
| 106 &message_loop_, &handler_, host_stub_, input_stub_); | |
| 107 connection2_ = new MockConnectionToClient( | 99 connection2_ = new MockConnectionToClient( |
| 108 &message_loop_, &handler_, host_stub2_, input_stub2_); | 100 &message_loop_, &handler_, host_stub2_, event_executor2_); |
| 109 session_ = new MockSession(); | 101 session_ = new MockSession(); |
| 110 session2_ = new MockSession(); | 102 session2_ = new MockSession(); |
| 111 session_config_.reset(SessionConfig::CreateDefault()); | 103 session_config_.reset(SessionConfig::CreateDefault()); |
| 112 session_config2_.reset(SessionConfig::CreateDefault()); | 104 session_config2_.reset(SessionConfig::CreateDefault()); |
| 113 | 105 |
| 114 ON_CALL(video_stub_, ProcessVideoPacket(_, _)) | 106 ON_CALL(video_stub_, ProcessVideoPacket(_, _)) |
| 115 .WillByDefault( | 107 .WillByDefault( |
| 116 DoAll(DeleteArg<0>(), DeleteArg<1>())); | 108 DoAll(DeleteArg<0>(), DeleteArg<1>())); |
| 117 ON_CALL(video_stub2_, ProcessVideoPacket(_, _)) | 109 ON_CALL(video_stub2_, ProcessVideoPacket(_, _)) |
| 118 .WillByDefault( | 110 .WillByDefault( |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 144 EXPECT_CALL(*connection2_.get(), client_stub()) | 136 EXPECT_CALL(*connection2_.get(), client_stub()) |
| 145 .Times(AnyNumber()); | 137 .Times(AnyNumber()); |
| 146 EXPECT_CALL(*connection2_.get(), session()) | 138 EXPECT_CALL(*connection2_.get(), session()) |
| 147 .Times(AnyNumber()); | 139 .Times(AnyNumber()); |
| 148 EXPECT_CALL(*session_.get(), config()) | 140 EXPECT_CALL(*session_.get(), config()) |
| 149 .Times(AnyNumber()); | 141 .Times(AnyNumber()); |
| 150 EXPECT_CALL(*session2_.get(), config()) | 142 EXPECT_CALL(*session2_.get(), config()) |
| 151 .Times(AnyNumber()); | 143 .Times(AnyNumber()); |
| 152 } | 144 } |
| 153 | 145 |
| 154 virtual void TearDown() { | |
| 155 } | |
| 156 | |
| 157 // Helper method to pretend a client is connected to ChromotingHost. | 146 // Helper method to pretend a client is connected to ChromotingHost. |
| 158 void SimulateClientConnection(int connection_index, bool authenticate) { | 147 void SimulateClientConnection(int connection_index) { |
| 159 scoped_refptr<MockConnectionToClient> connection = | 148 scoped_refptr<MockConnectionToClient> connection = |
| 160 (connection_index == 0) ? connection_ : connection2_; | 149 (connection_index == 0) ? connection_ : connection2_; |
| 161 protocol::LocalLoginCredentials& credentials = | |
| 162 authenticate ? credentials_good_ : credentials_bad_; | |
| 163 scoped_refptr<ClientSession> client = new ClientSession( | 150 scoped_refptr<ClientSession> client = new ClientSession( |
| 164 host_.get(), | 151 host_.get(), |
| 165 base::Bind(MakeUserAuthenticator), | 152 base::Bind(&ChromotingHostTest::user_authenticator, |
| 153 base::Unretained(this)), | |
| 166 connection, | 154 connection, |
| 167 input_stub_); | 155 event_executor_); |
| 168 connection->set_host_stub(client.get()); | 156 connection->set_host_stub(client.get()); |
| 169 | 157 |
| 170 context_.network_message_loop()->PostTask( | 158 context_.network_message_loop()->PostTask( |
| 171 FROM_HERE, | 159 FROM_HERE, |
| 172 NewRunnableMethod(host_.get(), | 160 NewRunnableMethod(host_.get(), |
| 173 &ChromotingHost::AddClient, | 161 &ChromotingHost::AddClient, |
| 174 client)); | 162 client)); |
| 175 context_.network_message_loop()->PostTask( | 163 context_.network_message_loop()->PostTask( |
| 176 FROM_HERE, | 164 FROM_HERE, |
| 177 NewRunnableMethod(host_.get(), | 165 NewRunnableMethod(host_.get(), |
| 178 &ChromotingHost::OnClientConnected, | 166 &ChromotingHost::OnClientConnected, |
| 179 connection)); | 167 connection)); |
| 168 | |
|
simonmorris
2011/04/01 10:29:34
Nit: extra line.
dmac
2011/04/01 21:15:07
Done.
| |
| 180 context_.network_message_loop()->PostTask( | 169 context_.network_message_loop()->PostTask( |
| 181 FROM_HERE, | 170 FROM_HERE, |
| 182 NewRunnableMethod(client.get(), | 171 NewRunnableMethod(client.get(), |
| 183 &ClientSession::BeginSessionRequest, | 172 &ClientSession::BeginSessionRequest, |
| 184 &credentials, | 173 &credentials_, |
| 185 NewRunnableFunction(&DummyDoneTask))); | 174 NewRunnableFunction(&DummyDoneTask))); |
| 186 } | 175 } |
| 187 | 176 |
| 188 // Helper method to remove a client connection from ChromotingHost. | 177 // Helper method to remove a client connection from ChromotingHost. |
| 189 void RemoveClientConnection() { | 178 void RemoveClientConnection() { |
| 190 context_.network_message_loop()->PostTask( | 179 context_.network_message_loop()->PostTask( |
| 191 FROM_HERE, | 180 FROM_HERE, |
| 192 NewRunnableMethod(host_.get(), | 181 NewRunnableMethod(host_.get(), |
| 193 &ChromotingHost::OnClientDisconnected, | 182 &ChromotingHost::OnClientDisconnected, |
| 194 connection_)); | 183 connection_)); |
| 195 } | 184 } |
| 196 | 185 |
| 186 UserAuthenticator* user_authenticator() { | |
| 187 return user_authenticator_.get(); | |
| 188 } | |
| 189 | |
| 197 protected: | 190 protected: |
| 198 MessageLoop message_loop_; | 191 MessageLoop message_loop_; |
| 199 MockConnectionToClientEventHandler handler_; | 192 MockConnectionToClientEventHandler handler_; |
| 200 scoped_refptr<ChromotingHost> host_; | 193 scoped_refptr<ChromotingHost> host_; |
| 201 scoped_refptr<InMemoryHostConfig> config_; | 194 scoped_refptr<InMemoryHostConfig> config_; |
| 202 MockChromotingHostContext context_; | 195 MockChromotingHostContext context_; |
| 203 protocol::LocalLoginCredentials credentials_good_; | 196 protocol::LocalLoginCredentials credentials_; |
| 204 protocol::LocalLoginCredentials credentials_bad_; | |
| 205 scoped_refptr<MockConnectionToClient> connection_; | 197 scoped_refptr<MockConnectionToClient> connection_; |
| 206 scoped_refptr<MockSession> session_; | 198 scoped_refptr<MockSession> session_; |
| 207 scoped_ptr<SessionConfig> session_config_; | 199 scoped_ptr<SessionConfig> session_config_; |
| 208 MockVideoStub video_stub_; | 200 MockVideoStub video_stub_; |
| 209 MockClientStub client_stub_; | 201 MockClientStub client_stub_; |
| 210 MockHostStub* host_stub_; | 202 MockHostStub* host_stub_; |
| 211 MockInputStub* input_stub_; | 203 MockEventExecutor* event_executor_; |
| 212 MockCurtain* curtain_; | 204 MockCurtain* curtain_; |
| 213 scoped_refptr<MockConnectionToClient> connection2_; | 205 scoped_refptr<MockConnectionToClient> connection2_; |
| 214 scoped_refptr<MockSession> session2_; | 206 scoped_refptr<MockSession> session2_; |
| 207 scoped_refptr<MockUserAuthenticator> user_authenticator_; | |
|
simonmorris
2011/04/01 10:29:34
It's sad to scatter refcounts throughout the code
simonmorris
2011/04/01 10:52:43
After a chat with Jamie, I realise that wouldn't w
| |
| 215 scoped_ptr<SessionConfig> session_config2_; | 208 scoped_ptr<SessionConfig> session_config2_; |
| 216 MockVideoStub video_stub2_; | 209 MockVideoStub video_stub2_; |
| 217 MockClientStub client_stub2_; | 210 MockClientStub client_stub2_; |
| 218 MockHostStub* host_stub2_; | 211 MockHostStub* host_stub2_; |
| 219 MockInputStub* input_stub2_; | 212 MockEventExecutor* event_executor2_; |
| 220 }; | 213 }; |
| 221 | 214 |
| 222 TEST_F(ChromotingHostTest, StartAndShutdown) { | 215 TEST_F(ChromotingHostTest, StartAndShutdown) { |
| 223 host_->Start(NewRunnableFunction(&PostQuitTask, &message_loop_)); | 216 host_->Start(NewRunnableFunction(&PostQuitTask, &message_loop_)); |
| 224 | 217 |
| 225 message_loop_.PostTask(FROM_HERE, | 218 message_loop_.PostTask(FROM_HERE, |
| 226 NewRunnableMethod(host_.get(), | 219 NewRunnableMethod(host_.get(), |
| 227 &ChromotingHost::Shutdown)); | 220 &ChromotingHost::Shutdown)); |
| 228 message_loop_.Run(); | 221 message_loop_.Run(); |
| 229 } | 222 } |
| 230 | 223 |
| 231 TEST_F(ChromotingHostTest, Connect) { | 224 TEST_F(ChromotingHostTest, Connect) { |
| 232 host_->Start(NewRunnableFunction(&PostQuitTask, &message_loop_)); | 225 host_->Start(NewRunnableFunction(&PostQuitTask, &message_loop_)); |
| 233 | 226 |
| 234 EXPECT_CALL(client_stub_, BeginSessionResponse(_, _)) | 227 EXPECT_CALL(client_stub_, BeginSessionResponse(_, _)) |
| 235 .WillOnce(RunDoneTask()); | 228 .WillOnce(RunDoneTask()); |
| 229 EXPECT_CALL(*user_authenticator_, Authenticate(_, _)) | |
| 230 .WillOnce(Return(true)); | |
| 236 | 231 |
| 237 // When the video packet is received we first shutdown ChromotingHost | 232 // When the video packet is received we first shutdown ChromotingHost |
| 238 // then execute the done task. | 233 // then execute the done task. |
| 239 InSequence s; | 234 InSequence s; |
| 240 EXPECT_CALL(*curtain_, EnableCurtainMode(true)) | 235 EXPECT_CALL(*curtain_, EnableCurtainMode(true)) |
| 241 .Times(1); | 236 .Times(1); |
| 242 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) | 237 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) |
| 243 .WillOnce(DoAll( | 238 .WillOnce(DoAll( |
| 244 InvokeWithoutArgs(host_.get(), &ChromotingHost::Shutdown), | 239 InvokeWithoutArgs(host_.get(), &ChromotingHost::Shutdown), |
| 245 RunDoneTask())) | 240 RunDoneTask())) |
| 246 .RetiresOnSaturation(); | 241 .RetiresOnSaturation(); |
| 247 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) | 242 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) |
| 248 .Times(AnyNumber()); | 243 .Times(AnyNumber()); |
| 249 EXPECT_CALL(*connection_.get(), Disconnect()) | 244 EXPECT_CALL(*connection_.get(), Disconnect()) |
| 250 .RetiresOnSaturation(); | 245 .RetiresOnSaturation(); |
| 251 | 246 SimulateClientConnection(0); |
| 252 SimulateClientConnection(0, true); | |
| 253 message_loop_.Run(); | 247 message_loop_.Run(); |
| 254 } | 248 } |
| 255 | 249 |
| 256 TEST_F(ChromotingHostTest, Reconnect) { | 250 TEST_F(ChromotingHostTest, Reconnect) { |
| 257 host_->Start(NewRunnableFunction(&PostQuitTask, &message_loop_)); | 251 host_->Start(NewRunnableFunction(&PostQuitTask, &message_loop_)); |
| 258 | 252 |
| 259 EXPECT_CALL(client_stub_, BeginSessionResponse(_, _)) | 253 EXPECT_CALL(client_stub_, BeginSessionResponse(_, _)) |
| 260 .Times(2) | 254 .Times(2) |
| 261 .WillRepeatedly(RunDoneTask()); | 255 .WillRepeatedly(RunDoneTask()); |
| 256 EXPECT_CALL(*user_authenticator_, Authenticate(_, _)) | |
| 257 .Times(2) | |
| 258 .WillRepeatedly(Return(true)); | |
| 262 | 259 |
| 263 // When the video packet is received we first disconnect the mock | 260 // When the video packet is received we first disconnect the mock |
| 264 // connection. | 261 // connection. |
| 265 { | 262 { |
| 266 InSequence s; | 263 InSequence s; |
| 267 // Ensure that curtain mode is activated before the first video packet. | 264 // Ensure that curtain mode is activated before the first video packet. |
| 268 EXPECT_CALL(*curtain_, EnableCurtainMode(true)) | 265 EXPECT_CALL(*curtain_, EnableCurtainMode(true)) |
| 269 .Times(1); | 266 .Times(1); |
| 270 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) | 267 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) |
| 271 .WillOnce(DoAll( | 268 .WillOnce(DoAll( |
| 272 InvokeWithoutArgs(this, | 269 InvokeWithoutArgs(this, |
| 273 &ChromotingHostTest::RemoveClientConnection), | 270 &ChromotingHostTest::RemoveClientConnection), |
| 274 RunDoneTask())) | 271 RunDoneTask())) |
| 275 .RetiresOnSaturation(); | 272 .RetiresOnSaturation(); |
| 276 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) | 273 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) |
| 277 .Times(AnyNumber()); | 274 .Times(AnyNumber()); |
| 278 EXPECT_CALL(*curtain_, EnableCurtainMode(false)) | 275 EXPECT_CALL(*curtain_, EnableCurtainMode(false)) |
| 279 .Times(1); | 276 .Times(1); |
| 280 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) | 277 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) |
| 281 .Times(AnyNumber()); | 278 .Times(AnyNumber()); |
| 282 } | 279 } |
| 283 | 280 |
| 284 // If Disconnect() is called we can break the main message loop. | 281 // If Disconnect() is called we can break the main message loop. |
| 285 EXPECT_CALL(*connection_.get(), Disconnect()) | 282 EXPECT_CALL(*connection_.get(), Disconnect()) |
| 286 .WillOnce(QuitMainMessageLoop(&message_loop_)) | 283 .WillOnce(QuitMainMessageLoop(&message_loop_)) |
| 287 .RetiresOnSaturation(); | 284 .RetiresOnSaturation(); |
| 288 | 285 |
| 289 SimulateClientConnection(0, true); | 286 SimulateClientConnection(0); |
| 290 message_loop_.Run(); | 287 message_loop_.Run(); |
| 291 | 288 |
| 292 // Connect the client again. | 289 // Connect the client again. |
| 293 { | 290 { |
| 294 InSequence s; | 291 InSequence s; |
| 295 EXPECT_CALL(*curtain_, EnableCurtainMode(true)) | 292 EXPECT_CALL(*curtain_, EnableCurtainMode(true)) |
| 296 .Times(1); | 293 .Times(1); |
| 297 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) | 294 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) |
| 298 .WillOnce(DoAll( | 295 .WillOnce(DoAll( |
| 299 InvokeWithoutArgs(host_.get(), &ChromotingHost::Shutdown), | 296 InvokeWithoutArgs(host_.get(), &ChromotingHost::Shutdown), |
| 300 RunDoneTask())) | 297 RunDoneTask())) |
| 301 .RetiresOnSaturation(); | 298 .RetiresOnSaturation(); |
| 302 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) | 299 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) |
| 303 .Times(AnyNumber()); | 300 .Times(AnyNumber()); |
| 304 } | 301 } |
| 305 EXPECT_CALL(*connection_.get(), Disconnect()) | 302 EXPECT_CALL(*connection_.get(), Disconnect()) |
| 306 .RetiresOnSaturation(); | 303 .RetiresOnSaturation(); |
| 307 | 304 |
| 308 SimulateClientConnection(0, true); | 305 SimulateClientConnection(0); |
| 309 message_loop_.Run(); | 306 message_loop_.Run(); |
| 310 } | 307 } |
| 311 | 308 |
| 312 TEST_F(ChromotingHostTest, ConnectTwice) { | 309 TEST_F(ChromotingHostTest, ConnectTwice) { |
| 313 host_->Start(NewRunnableFunction(&PostQuitTask, &message_loop_)); | 310 host_->Start(NewRunnableFunction(&PostQuitTask, &message_loop_)); |
| 314 | 311 |
| 315 EXPECT_CALL(client_stub_, BeginSessionResponse(_, _)) | 312 EXPECT_CALL(client_stub_, BeginSessionResponse(_, _)) |
| 316 .Times(1) | 313 .Times(1) |
| 317 .WillRepeatedly(RunDoneTask()); | 314 .WillRepeatedly(RunDoneTask()); |
| 318 | 315 |
| 319 EXPECT_CALL(client_stub2_, BeginSessionResponse(_, _)) | 316 EXPECT_CALL(client_stub2_, BeginSessionResponse(_, _)) |
| 320 .Times(1) | 317 .Times(1) |
| 321 .WillRepeatedly(RunDoneTask()); | 318 .WillRepeatedly(RunDoneTask()); |
| 322 | 319 |
| 320 EXPECT_CALL(*user_authenticator_, Authenticate(_, _)) | |
| 321 .Times(2) | |
| 322 .WillRepeatedly(Return(true)); | |
| 323 | |
| 323 // When a video packet is received we connect the second mock | 324 // When a video packet is received we connect the second mock |
| 324 // connection. | 325 // connection. |
| 325 { | 326 { |
| 326 InSequence s; | 327 InSequence s; |
| 327 EXPECT_CALL(*curtain_, EnableCurtainMode(true)) | 328 EXPECT_CALL(*curtain_, EnableCurtainMode(true)) |
| 328 .Times(1) | 329 .Times(1) |
| 329 .WillOnce(QuitMainMessageLoop(&message_loop_)); | 330 .WillOnce(QuitMainMessageLoop(&message_loop_)); |
| 330 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) | 331 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) |
| 331 .WillOnce(DoAll( | 332 .WillOnce(DoAll( |
| 332 InvokeWithoutArgs( | 333 InvokeWithoutArgs( |
| 333 CreateFunctor( | 334 CreateFunctor( |
| 334 this, | 335 this, |
| 335 &ChromotingHostTest::SimulateClientConnection, 1, true)), | 336 &ChromotingHostTest::SimulateClientConnection, 1)), |
| 336 RunDoneTask())) | 337 RunDoneTask())) |
| 337 .RetiresOnSaturation(); | 338 .RetiresOnSaturation(); |
| 338 // Check that the second connection does not affect curtain mode. | 339 // Check that the second connection does not affect curtain mode. |
| 339 EXPECT_CALL(*curtain_, EnableCurtainMode(_)) | 340 EXPECT_CALL(*curtain_, EnableCurtainMode(_)) |
| 340 .Times(0); | 341 .Times(0); |
| 341 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) | 342 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) |
| 342 .Times(AnyNumber()); | 343 .Times(AnyNumber()); |
| 343 EXPECT_CALL(video_stub2_, ProcessVideoPacket(_, _)) | 344 EXPECT_CALL(video_stub2_, ProcessVideoPacket(_, _)) |
| 344 .WillOnce(DoAll( | 345 .WillOnce(DoAll( |
| 345 InvokeWithoutArgs(host_.get(), &ChromotingHost::Shutdown), | 346 InvokeWithoutArgs(host_.get(), &ChromotingHost::Shutdown), |
| 346 RunDoneTask())) | 347 RunDoneTask())) |
| 347 .RetiresOnSaturation(); | 348 .RetiresOnSaturation(); |
| 348 EXPECT_CALL(video_stub2_, ProcessVideoPacket(_, _)) | 349 EXPECT_CALL(video_stub2_, ProcessVideoPacket(_, _)) |
| 349 .Times(AnyNumber()); | 350 .Times(AnyNumber()); |
| 350 } | 351 } |
| 351 | 352 |
| 352 EXPECT_CALL(*connection_.get(), Disconnect()) | 353 EXPECT_CALL(*connection_.get(), Disconnect()) |
| 353 .RetiresOnSaturation(); | 354 .RetiresOnSaturation(); |
| 354 EXPECT_CALL(*connection2_.get(), Disconnect()) | 355 EXPECT_CALL(*connection2_.get(), Disconnect()) |
| 355 .RetiresOnSaturation(); | 356 .RetiresOnSaturation(); |
| 356 | 357 |
| 357 SimulateClientConnection(0, true); | 358 SimulateClientConnection(0); |
| 358 message_loop_.Run(); | 359 message_loop_.Run(); |
| 359 } | 360 } |
| 360 | 361 |
| 361 TEST_F(ChromotingHostTest, CurtainModeFail) { | 362 TEST_F(ChromotingHostTest, CurtainModeFail) { |
| 362 host_->Start(NewRunnableFunction(&PostQuitTask, &message_loop_)); | 363 host_->Start(NewRunnableFunction(&PostQuitTask, &message_loop_)); |
| 363 | 364 |
| 364 EXPECT_CALL(client_stub_, BeginSessionResponse(_, _)) | 365 EXPECT_CALL(client_stub_, BeginSessionResponse(_, _)) |
| 365 .Times(1) | 366 .WillOnce(RunDoneTask()); |
| 366 .WillRepeatedly(RunDoneTask()); | 367 EXPECT_CALL(*user_authenticator_, Authenticate(_, _)) |
| 368 .WillOnce(Return(false)); | |
| 367 | 369 |
| 368 // Ensure that curtain mode is not activated if a connection does not | 370 // Ensure that curtain mode is not activated if a connection does not |
| 369 // authenticate. | 371 // authenticate. |
| 370 EXPECT_CALL(*curtain_, EnableCurtainMode(_)) | 372 EXPECT_CALL(*curtain_, EnableCurtainMode(_)) |
| 371 .Times(0); | 373 .Times(0); |
| 372 EXPECT_CALL(*connection_.get(), Disconnect()) | 374 EXPECT_CALL(*connection_.get(), Disconnect()) |
| 373 .WillOnce(QuitMainMessageLoop(&message_loop_)); | 375 .WillOnce(QuitMainMessageLoop(&message_loop_)); |
| 374 SimulateClientConnection(0, false); | 376 SimulateClientConnection(0); |
| 375 RemoveClientConnection(); | 377 RemoveClientConnection(); |
| 376 message_loop_.Run(); | 378 message_loop_.Run(); |
| 377 } | 379 } |
| 378 | 380 |
| 379 TEST_F(ChromotingHostTest, CurtainModeFailSecond) { | 381 TEST_F(ChromotingHostTest, CurtainModeFailSecond) { |
| 380 host_->Start(NewRunnableFunction(&PostQuitTask, &message_loop_)); | 382 host_->Start(NewRunnableFunction(&PostQuitTask, &message_loop_)); |
| 381 | 383 |
| 382 EXPECT_CALL(client_stub_, BeginSessionResponse(_, _)) | 384 EXPECT_CALL(client_stub_, BeginSessionResponse(_, _)) |
| 383 .Times(1) | 385 .WillOnce(RunDoneTask()); |
| 384 .WillRepeatedly(RunDoneTask()); | |
| 385 | 386 |
| 386 EXPECT_CALL(client_stub2_, BeginSessionResponse(_, _)) | 387 EXPECT_CALL(client_stub2_, BeginSessionResponse(_, _)) |
| 387 .Times(1) | 388 .WillOnce(RunDoneTask()); |
| 388 .WillRepeatedly(RunDoneTask()); | 389 |
| 390 EXPECT_CALL(*user_authenticator_, Authenticate(_, _)) | |
| 391 .WillOnce(Return(true)) | |
| 392 .WillOnce(Return(false)); | |
| 389 | 393 |
| 390 // When a video packet is received we connect the second mock | 394 // When a video packet is received we connect the second mock |
| 391 // connection. | 395 // connection. |
| 392 { | 396 { |
| 393 InSequence s; | 397 InSequence s; |
| 394 EXPECT_CALL(*curtain_, EnableCurtainMode(true)) | 398 EXPECT_CALL(*curtain_, EnableCurtainMode(true)) |
| 395 .Times(1) | |
| 396 .WillOnce(QuitMainMessageLoop(&message_loop_)); | 399 .WillOnce(QuitMainMessageLoop(&message_loop_)); |
| 397 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) | 400 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) |
| 398 .WillOnce(DoAll( | 401 .WillOnce(DoAll( |
| 399 InvokeWithoutArgs( | 402 InvokeWithoutArgs( |
| 400 CreateFunctor( | 403 CreateFunctor( |
| 401 this, | 404 this, |
| 402 &ChromotingHostTest::SimulateClientConnection, 1, false)), | 405 &ChromotingHostTest::SimulateClientConnection, 1)), |
| 403 RunDoneTask())) | 406 RunDoneTask())) |
| 404 .RetiresOnSaturation(); | 407 .RetiresOnSaturation(); |
| 405 // Check that the second connection does not affect curtain mode. | 408 // Check that the second connection does not affect curtain mode. |
| 406 EXPECT_CALL(*curtain_, EnableCurtainMode(_)) | 409 EXPECT_CALL(*curtain_, EnableCurtainMode(_)) |
| 407 .Times(0); | 410 .Times(0); |
| 408 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) | 411 EXPECT_CALL(video_stub_, ProcessVideoPacket(_, _)) |
| 409 .Times(AnyNumber()); | 412 .Times(AnyNumber()); |
| 410 EXPECT_CALL(video_stub2_, ProcessVideoPacket(_, _)) | 413 EXPECT_CALL(video_stub2_, ProcessVideoPacket(_, _)) |
| 411 .Times(0); | 414 .Times(0); |
| 412 } | 415 } |
| 413 | 416 |
| 414 SimulateClientConnection(0, true); | 417 SimulateClientConnection(0); |
| 415 message_loop_.Run(); | 418 message_loop_.Run(); |
| 416 } | 419 } |
| 417 | 420 |
| 418 } // namespace remoting | 421 } // namespace remoting |
| OLD | NEW |