15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/mouse_input_filter.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/proto/event.pb.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/protocol_mock_objects.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::InSequence; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protocol { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P2(EqualsMouseMoveEvent, x, y, "") { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return arg.x() == x && arg.y() == y; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static MouseEvent MouseMoveEvent(int x, int y) { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseEvent event; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.set_x(x); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.set_y(y); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return event; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void InjectTestSequence(InputStub* input_stub) { 31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) struct Point { 32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int x; 33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int y; 34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) }; 35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static const Point input_sequence[] = { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {-5, 10}, {0, 10}, {-1, 10}, {15, 40}, {15, 45}, {15, 39}, {15, 25} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // arraysize() cannot be used here, becase Point is declared inside of a 39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // function. 40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (unsigned int i = 0; i < ARRAYSIZE_UNSAFE(input_sequence); ++i) { 41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const Point& point = input_sequence[i]; 42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) input_stub->InjectMouseEvent(MouseMoveEvent(point.x, point.y)); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (unsigned int i = 0; i < ARRAYSIZE_UNSAFE(input_sequence); ++i) { 45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const Point& point = input_sequence[i]; 46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) input_stub->InjectMouseEvent(MouseMoveEvent(point.y, point.x)); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that no events get through if we don't set either dimensions. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MouseInputFilterTest, BothDimensionsZero) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockInputStub mock_stub; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseInputFilter mouse_filter(&mock_stub); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(_)) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(0); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectTestSequence(&mouse_filter); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that no events get through if there's no input size. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MouseInputFilterTest, InputDimensionsZero) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockInputStub mock_stub; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseInputFilter mouse_filter(&mock_stub); 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mouse_filter.set_output_size(webrtc::DesktopSize(50, 50)); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(_)) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(0); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectTestSequence(&mouse_filter); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that no events get through if there's no output size. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MouseInputFilterTest, OutputDimensionsZero) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockInputStub mock_stub; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseInputFilter mouse_filter(&mock_stub); 77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mouse_filter.set_input_size(webrtc::DesktopSize(50, 50)); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(_)) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(0); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectTestSequence(&mouse_filter); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that all events get through, clamped to the output. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MouseInputFilterTest, NoScalingOrClipping) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockInputStub mock_stub; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseInputFilter mouse_filter(&mock_stub); 89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mouse_filter.set_output_size(webrtc::DesktopSize(40,40)); 90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mouse_filter.set_input_size(webrtc::DesktopSize(40,40)); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence s; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(0, 10))). 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(3); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(15, 39))). 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(3); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(15, 25))). 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(1); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(10, 0))). 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(3); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(39, 15))). 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(3); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(25, 15))). 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(1); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectTestSequence(&mouse_filter); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can up-scale with clamping. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MouseInputFilterTest, UpScalingAndClamping) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockInputStub mock_stub; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseInputFilter mouse_filter(&mock_stub); 117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mouse_filter.set_output_size(webrtc::DesktopSize(80, 80)); 118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mouse_filter.set_input_size(webrtc::DesktopSize(40, 40)); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence s; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(0, 20))). 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(3); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(30, 79))). 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(3); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(30, 51))). 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(1); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(20, 0))). 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(3); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(79, 30))). 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(3); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(51, 30))). 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(1); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectTestSequence(&mouse_filter); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can down-scale with clamping. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MouseInputFilterTest, DownScalingAndClamping) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockInputStub mock_stub; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseInputFilter mouse_filter(&mock_stub); 145d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mouse_filter.set_output_size(webrtc::DesktopSize(30, 30)); 146d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mouse_filter.set_input_size(webrtc::DesktopSize(40, 40)); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence s; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(0, 7))). 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(3); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(11, 29))). 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(3); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(11, 19))). 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(1); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(7, 0))). 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(3); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(29, 11))). 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(3); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(19, 11))). 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Times(1); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InjectTestSequence(&mouse_filter); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace protocol 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 172