OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 <algorithm> | 5 #include <algorithm> |
6 #include <string> | 6 #include <string> |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
(...skipping 24 matching lines...) Expand all Loading... |
35 using protocol::MockClientStub; | 35 using protocol::MockClientStub; |
36 using protocol::MockHostStub; | 36 using protocol::MockHostStub; |
37 using protocol::MockInputStub; | 37 using protocol::MockInputStub; |
38 using protocol::MockSession; | 38 using protocol::MockSession; |
39 using protocol::MockVideoStub; | 39 using protocol::MockVideoStub; |
40 using protocol::SessionConfig; | 40 using protocol::SessionConfig; |
41 | 41 |
42 using testing::_; | 42 using testing::_; |
43 using testing::AnyNumber; | 43 using testing::AnyNumber; |
44 using testing::AtMost; | 44 using testing::AtMost; |
| 45 using testing::AtLeast; |
45 using testing::CreateFunctor; | 46 using testing::CreateFunctor; |
46 using testing::DeleteArg; | 47 using testing::DeleteArg; |
47 using testing::DoAll; | 48 using testing::DoAll; |
48 using testing::Expectation; | 49 using testing::Expectation; |
49 using testing::Invoke; | 50 using testing::Invoke; |
50 using testing::Return; | 51 using testing::Return; |
51 using testing::ReturnRef; | 52 using testing::ReturnRef; |
52 using testing::Sequence; | 53 using testing::Sequence; |
53 using testing::StrEq; | 54 using testing::StrEq; |
54 using testing::StrictMock; | 55 using testing::StrictMock; |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 | 304 |
304 webrtc::DesktopCapturer* ClientSessionTest::CreateVideoCapturer() { | 305 webrtc::DesktopCapturer* ClientSessionTest::CreateVideoCapturer() { |
305 return new FakeDesktopCapturer(); | 306 return new FakeDesktopCapturer(); |
306 } | 307 } |
307 | 308 |
308 webrtc::MouseCursorMonitor* ClientSessionTest::CreateMouseCursorMonitor() { | 309 webrtc::MouseCursorMonitor* ClientSessionTest::CreateMouseCursorMonitor() { |
309 return new FakeMouseCursorMonitor(); | 310 return new FakeMouseCursorMonitor(); |
310 } | 311 } |
311 | 312 |
312 void ClientSessionTest::ConnectClientSession() { | 313 void ClientSessionTest::ConnectClientSession() { |
| 314 // Stubs should be set only after connection is authenticated. |
| 315 EXPECT_FALSE(connection_->clipboard_stub()); |
| 316 EXPECT_FALSE(connection_->input_stub()); |
| 317 |
313 client_session_->OnConnectionAuthenticated(client_session_->connection()); | 318 client_session_->OnConnectionAuthenticated(client_session_->connection()); |
| 319 |
| 320 EXPECT_TRUE(connection_->clipboard_stub()); |
| 321 EXPECT_TRUE(connection_->input_stub()); |
| 322 |
314 client_session_->OnConnectionChannelsConnected(client_session_->connection()); | 323 client_session_->OnConnectionChannelsConnected(client_session_->connection()); |
315 } | 324 } |
316 | 325 |
317 void ClientSessionTest::SetMatchCapabilitiesExpectation() { | 326 void ClientSessionTest::SetMatchCapabilitiesExpectation() { |
318 // Set the client to report the same capabilities as the host. | 327 // Set the client to report the same capabilities as the host. |
319 EXPECT_CALL(client_stub_, SetCapabilities(_)) | 328 EXPECT_CALL(client_stub_, SetCapabilities(_)) |
320 .Times(AtMost(1)) | 329 .Times(AtMost(1)) |
321 .WillOnce(Invoke(client_session_.get(), &ClientSession::SetCapabilities)); | 330 .WillOnce(Invoke(client_session_.get(), &ClientSession::SetCapabilities)); |
322 } | 331 } |
323 | 332 |
(...skipping 15 matching lines...) Expand all Loading... |
339 } | 348 } |
340 | 349 |
341 MATCHER_P2(EqualsClipboardEvent, m, d, "") { | 350 MATCHER_P2(EqualsClipboardEvent, m, d, "") { |
342 return (strcmp(arg.mime_type().c_str(), m) == 0 && | 351 return (strcmp(arg.mime_type().c_str(), m) == 0 && |
343 memcmp(arg.data().data(), d, arg.data().size()) == 0); | 352 memcmp(arg.data().data(), d, arg.data().size()) == 0); |
344 } | 353 } |
345 | 354 |
346 TEST_F(ClientSessionTest, ClipboardStubFilter) { | 355 TEST_F(ClientSessionTest, ClipboardStubFilter) { |
347 CreateClientSession(); | 356 CreateClientSession(); |
348 | 357 |
349 protocol::ClipboardEvent clipboard_event1; | 358 EXPECT_CALL(session_event_handler_, OnSessionAuthenticated(_)) |
350 clipboard_event1.set_mime_type(kMimeTypeTextUtf8); | 359 .WillOnce(Return(true)); |
351 clipboard_event1.set_data("a"); | 360 EXPECT_CALL(*input_injector_, StartPtr(_)); |
352 | 361 EXPECT_CALL(session_event_handler_, OnSessionChannelsConnected(_)); |
353 protocol::ClipboardEvent clipboard_event2; | |
354 clipboard_event2.set_mime_type(kMimeTypeTextUtf8); | |
355 clipboard_event2.set_data("b"); | |
356 | |
357 protocol::ClipboardEvent clipboard_event3; | |
358 clipboard_event3.set_mime_type(kMimeTypeTextUtf8); | |
359 clipboard_event3.set_data("c"); | |
360 | |
361 Expectation authenticated = | |
362 EXPECT_CALL(session_event_handler_, OnSessionAuthenticated(_)) | |
363 .WillOnce(Return(true)); | |
364 EXPECT_CALL(*input_injector_, StartPtr(_)) | |
365 .After(authenticated); | |
366 EXPECT_CALL(session_event_handler_, OnSessionChannelsConnected(_)) | |
367 .After(authenticated); | |
368 | 362 |
369 // Wait for the first video packet to be captured to make sure that | 363 // Wait for the first video packet to be captured to make sure that |
370 // the injected input will go though. Otherwise mouse events will be blocked | 364 // the injected input will go though. Otherwise mouse events will be blocked |
371 // by the mouse clamping filter. | 365 // by the mouse clamping filter. |
372 Sequence s; | 366 base::RunLoop run_loop; |
373 EXPECT_CALL(video_stub_, ProcessVideoPacketPtr(_, _)) | 367 EXPECT_CALL(video_stub_, ProcessVideoPacketPtr(_, _)) |
374 .InSequence(s) | 368 .Times(AtLeast(1)) |
375 .After(authenticated) | 369 .WillOnce(testing::InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit)); |
376 .WillOnce(DoAll( | |
377 // This event should get through to the clipboard stub. | |
378 InjectClipboardEvent(connection_, clipboard_event2), | |
379 InvokeWithoutArgs(this, &ClientSessionTest::DisconnectClientSession), | |
380 // This event should not get through to the clipboard stub, | |
381 // because the client has disconnected. | |
382 InjectClipboardEvent(connection_, clipboard_event3), | |
383 InvokeWithoutArgs(this, &ClientSessionTest::StopClientSession))); | |
384 EXPECT_CALL(*input_injector_, InjectClipboardEvent(EqualsClipboardEvent( | |
385 kMimeTypeTextUtf8, "b"))) | |
386 .InSequence(s); | |
387 EXPECT_CALL(session_event_handler_, OnSessionClosed(_)) | |
388 .InSequence(s); | |
389 | 370 |
390 // This event should not get through to the clipboard stub, | 371 { |
391 // because the client isn't authenticated yet. | 372 EXPECT_CALL(*input_injector_, InjectClipboardEvent(EqualsClipboardEvent( |
392 connection_->clipboard_stub()->InjectClipboardEvent(clipboard_event1); | 373 kMimeTypeTextUtf8, "a"))); |
| 374 EXPECT_CALL(*input_injector_, InjectKeyEvent(EqualsUsbEvent(1, true))); |
| 375 EXPECT_CALL(*input_injector_, InjectKeyEvent(EqualsUsbEvent(1, false))); |
| 376 EXPECT_CALL(*input_injector_, InjectMouseEvent(EqualsMouseEvent(100, 101))); |
| 377 |
| 378 EXPECT_CALL(*input_injector_, InjectClipboardEvent(EqualsClipboardEvent( |
| 379 kMimeTypeTextUtf8, "c"))); |
| 380 EXPECT_CALL(*input_injector_, InjectKeyEvent(EqualsUsbEvent(3, true))); |
| 381 EXPECT_CALL(*input_injector_, InjectMouseEvent(EqualsMouseEvent(300, 301))); |
| 382 EXPECT_CALL(*input_injector_, InjectKeyEvent(EqualsUsbEvent(3, false))); |
| 383 } |
393 | 384 |
394 ConnectClientSession(); | 385 ConnectClientSession(); |
395 } | |
396 | 386 |
397 TEST_F(ClientSessionTest, InputStubFilter) { | 387 // With for the first frame. |
398 CreateClientSession(); | 388 run_loop.Run(); |
399 | 389 |
400 protocol::KeyEvent key_event1; | 390 // Inject test events that are expected to be injected. |
401 key_event1.set_pressed(true); | 391 protocol::ClipboardEvent clipboard_event; |
402 key_event1.set_usb_keycode(1); | 392 clipboard_event.set_mime_type(kMimeTypeTextUtf8); |
| 393 clipboard_event.set_data("a"); |
| 394 connection_->clipboard_stub()->InjectClipboardEvent(clipboard_event); |
403 | 395 |
404 protocol::KeyEvent key_event2_down; | 396 protocol::KeyEvent key_event; |
405 key_event2_down.set_pressed(true); | 397 key_event.set_pressed(true); |
406 key_event2_down.set_usb_keycode(2); | 398 key_event.set_usb_keycode(1); |
| 399 connection_->input_stub()->InjectKeyEvent(key_event); |
407 | 400 |
408 protocol::KeyEvent key_event2_up; | 401 protocol::MouseEvent mouse_event; |
409 key_event2_up.set_pressed(false); | 402 mouse_event.set_x(100); |
410 key_event2_up.set_usb_keycode(2); | 403 mouse_event.set_y(101); |
| 404 connection_->input_stub()->InjectMouseEvent(mouse_event); |
411 | 405 |
412 protocol::KeyEvent key_event3; | 406 base::RunLoop().RunUntilIdle(); |
413 key_event3.set_pressed(true); | |
414 key_event3.set_usb_keycode(3); | |
415 | 407 |
416 protocol::MouseEvent mouse_event1; | 408 // Disable input. |
417 mouse_event1.set_x(100); | 409 client_session_->SetDisableInputs(true); |
418 mouse_event1.set_y(101); | |
419 | 410 |
420 protocol::MouseEvent mouse_event2; | 411 // These event shouldn't get though to the input injector. |
421 mouse_event2.set_x(200); | 412 clipboard_event.set_data("b"); |
422 mouse_event2.set_y(201); | 413 connection_->clipboard_stub()->InjectClipboardEvent(clipboard_event); |
423 | 414 |
424 protocol::MouseEvent mouse_event3; | 415 key_event.set_pressed(true); |
425 mouse_event3.set_x(300); | 416 key_event.set_usb_keycode(2); |
426 mouse_event3.set_y(301); | 417 connection_->input_stub()->InjectKeyEvent(key_event); |
| 418 key_event.set_pressed(false); |
| 419 key_event.set_usb_keycode(2); |
| 420 connection_->input_stub()->InjectKeyEvent(key_event); |
427 | 421 |
428 Expectation authenticated = | 422 mouse_event.set_x(200); |
429 EXPECT_CALL(session_event_handler_, OnSessionAuthenticated(_)) | 423 mouse_event.set_y(201); |
430 .WillOnce(Return(true)); | 424 connection_->input_stub()->InjectMouseEvent(mouse_event); |
431 EXPECT_CALL(*input_injector_, StartPtr(_)) | |
432 .After(authenticated); | |
433 EXPECT_CALL(session_event_handler_, OnSessionChannelsConnected(_)) | |
434 .After(authenticated); | |
435 | 425 |
436 // Wait for the first video packet to be captured to make sure that | 426 base::RunLoop().RunUntilIdle(); |
437 // the injected input will go though. Otherwise mouse events will be blocked | |
438 // by the mouse clamping filter. | |
439 Sequence s; | |
440 EXPECT_CALL(video_stub_, ProcessVideoPacketPtr(_, _)) | |
441 .InSequence(s) | |
442 .After(authenticated) | |
443 .WillOnce(DoAll( | |
444 // These events should get through to the input stub. | |
445 InjectKeyEvent(connection_, key_event2_down), | |
446 InjectKeyEvent(connection_, key_event2_up), | |
447 InjectMouseEvent(connection_, mouse_event2), | |
448 InvokeWithoutArgs(this, &ClientSessionTest::DisconnectClientSession), | |
449 // These events should not get through to the input stub, | |
450 // because the client has disconnected. | |
451 InjectKeyEvent(connection_, key_event3), | |
452 InjectMouseEvent(connection_, mouse_event3), | |
453 InvokeWithoutArgs(this, &ClientSessionTest::StopClientSession))); | |
454 EXPECT_CALL(*input_injector_, InjectKeyEvent(EqualsUsbEvent(2, true))) | |
455 .InSequence(s); | |
456 EXPECT_CALL(*input_injector_, InjectKeyEvent(EqualsUsbEvent(2, false))) | |
457 .InSequence(s); | |
458 EXPECT_CALL(*input_injector_, InjectMouseEvent(EqualsMouseEvent(200, 201))) | |
459 .InSequence(s); | |
460 EXPECT_CALL(session_event_handler_, OnSessionClosed(_)) | |
461 .InSequence(s); | |
462 | 427 |
463 // These events should not get through to the input stub, | 428 // Enable input again. |
464 // because the client isn't authenticated yet. | 429 client_session_->SetDisableInputs(false); |
465 connection_->input_stub()->InjectKeyEvent(key_event1); | |
466 connection_->input_stub()->InjectMouseEvent(mouse_event1); | |
467 | 430 |
468 ConnectClientSession(); | 431 clipboard_event.set_data("c"); |
| 432 connection_->clipboard_stub()->InjectClipboardEvent(clipboard_event); |
| 433 base::RunLoop().RunUntilIdle(); |
| 434 |
| 435 key_event.set_pressed(true); |
| 436 key_event.set_usb_keycode(3); |
| 437 connection_->input_stub()->InjectKeyEvent(key_event); |
| 438 |
| 439 mouse_event.set_x(300); |
| 440 mouse_event.set_y(301); |
| 441 connection_->input_stub()->InjectMouseEvent(mouse_event); |
| 442 |
| 443 client_session_->DisconnectSession(); |
| 444 client_session_->OnConnectionClosed(connection_, protocol::OK); |
| 445 client_session_.reset(); |
469 } | 446 } |
470 | 447 |
471 TEST_F(ClientSessionTest, LocalInputTest) { | 448 TEST_F(ClientSessionTest, LocalInputTest) { |
472 CreateClientSession(); | 449 CreateClientSession(); |
473 | 450 |
474 protocol::MouseEvent mouse_event1; | 451 protocol::MouseEvent mouse_event1; |
475 mouse_event1.set_x(100); | 452 mouse_event1.set_x(100); |
476 mouse_event1.set_y(101); | 453 mouse_event1.set_y(101); |
477 protocol::MouseEvent mouse_event2; | 454 protocol::MouseEvent mouse_event2; |
478 mouse_event2.set_x(200); | 455 mouse_event2.set_x(200); |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 | 785 |
809 DisconnectClientSession(); | 786 DisconnectClientSession(); |
810 StopClientSession(); | 787 StopClientSession(); |
811 | 788 |
812 // ext1 was instantiated and wrapped the video capturer. | 789 // ext1 was instantiated and wrapped the video capturer. |
813 EXPECT_TRUE(extension.was_instantiated()); | 790 EXPECT_TRUE(extension.was_instantiated()); |
814 EXPECT_TRUE(extension.has_wrapped_video_capturer()); | 791 EXPECT_TRUE(extension.has_wrapped_video_capturer()); |
815 } | 792 } |
816 | 793 |
817 } // namespace remoting | 794 } // namespace remoting |
OLD | NEW |