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/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"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protocol {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P2(EqualsKeyEvent, usb_keycode, pressed, "") {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return arg.usb_keycode() == static_cast<uint32>(usb_keycode) &&
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         arg.pressed() == pressed;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P2(EqualsMouseMoveEvent, x, y, "") {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return arg.x() == x && arg.y() == y;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static KeyEvent NewKeyEvent(uint32 usb_keycode, bool pressed) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KeyEvent event;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.set_usb_keycode(usb_keycode);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.set_pressed(pressed);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return event;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static MouseEvent MouseMoveEvent(int x, int y) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MouseEvent event;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.set_x(x);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event.set_y(y);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return event;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void InjectTestSequence(protocol::InputStub* input_stub) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Inject a key event.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_stub->InjectKeyEvent(NewKeyEvent(0, true));
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_stub->InjectKeyEvent(NewKeyEvent(0, false));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Inject mouse movemement.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_stub->InjectMouseEvent(MouseMoveEvent(10, 20));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the filter passes events on correctly to a configured stub.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(InputFilterTest, EventsPassThroughFilter) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockInputStub input_stub;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InputFilter input_filter(&input_stub);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(input_stub, InjectKeyEvent(EqualsKeyEvent(0, true)));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(input_stub, InjectKeyEvent(EqualsKeyEvent(0, false)));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(input_stub, InjectMouseEvent(EqualsMouseMoveEvent(10, 20)));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InjectTestSequence(&input_filter);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the filter ignores events if disabled.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(InputFilterTest, IgnoreEventsIfDisabled) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockInputStub input_stub;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InputFilter input_filter(&input_stub);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_filter.set_enabled(false);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(input_stub, InjectKeyEvent(_)).Times(0);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(input_stub, InjectMouseEvent(_)).Times(0);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InjectTestSequence(&input_filter);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the filter ignores events if not configured.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(InputFilterTest, IgnoreEventsIfNotConfigured) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InputFilter input_filter;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InjectTestSequence(&input_filter);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace protocol
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting
83