19
19
#include "src/server/input/default_input_device_hub.h"
20
20
#include "src/server/input/basic_seat.h"
21
#include "src/server/input/config_changer.h"
22
#include "src/server/scene/broadcasting_session_event_sink.h"
22
24
#include "mir/test/doubles/mock_input_device.h"
23
25
#include "mir/test/doubles/mock_input_device_observer.h"
25
27
#include "mir/test/doubles/mock_input_region.h"
26
28
#include "mir/test/doubles/mock_touch_visualizer.h"
27
29
#include "mir/test/doubles/mock_cursor_listener.h"
28
#include "mir/test/doubles/mock_event_sink.h"
30
#include "mir/test/doubles/mock_input_manager.h"
29
31
#include "mir/test/doubles/mock_seat_report.h"
30
32
#include "mir/test/doubles/mock_server_status_listener.h"
33
#include "mir/test/doubles/mock_scene_session.h"
34
#include "mir/test/doubles/stub_session_container.h"
31
35
#include "mir/test/doubles/triggered_main_loop.h"
32
36
#include "mir/test/event_matchers.h"
33
37
#include "mir/test/doubles/advanceable_clock.h"
53
57
namespace mt = mir::test;
54
58
namespace mtd = mt::doubles;
55
59
namespace mi = mir::input;
60
namespace ms = mir::scene;
56
61
namespace geom = mir::geometry;
57
62
using namespace std::literals::chrono_literals;
58
63
using namespace ::testing;
79
84
mtd::TriggeredMainLoop observer_loop;
80
85
NiceMock<mtd::MockInputDispatcher> mock_dispatcher;
81
86
NiceMock<mtd::MockInputRegion> mock_region;
82
NiceMock<mtd::MockEventSink> mock_sink;
83
87
std::shared_ptr<mir::cookie::Authority> cookie_authority = mir::cookie::Authority::create();
84
88
NiceMock<mtd::MockCursorListener> mock_cursor_listener;
85
89
NiceMock<mtd::MockTouchVisualizer> mock_visualizer;
88
92
mi::receiver::XKBMapper key_mapper;
89
93
mir::dispatch::MultiplexingDispatchable multiplexer;
90
94
mtd::AdvanceableClock clock;
95
mtd::MockInputManager mock_input_manager;
96
mtd::StubSessionContainer stub_session_container;
97
ms::BroadcastingSessionEventSink session_event_sink;
91
98
mi::BasicSeat seat{
92
99
mt::fake_shared(mock_dispatcher),mt::fake_shared(mock_visualizer), mt::fake_shared(mock_cursor_listener),
93
100
mt::fake_shared(mock_region), mt::fake_shared(key_mapper), mt::fake_shared(clock), mt::fake_shared(mock_seat_observer)};
94
101
mi::DefaultInputDeviceHub hub{
95
mt::fake_shared(mock_sink), mt::fake_shared(seat), mt::fake_shared(multiplexer), mt::fake_shared(observer_loop),
102
mt::fake_shared(seat), mt::fake_shared(multiplexer), mt::fake_shared(observer_loop),
96
103
cookie_authority, mt::fake_shared(key_mapper), mt::fake_shared(mock_status_listener)};
97
104
NiceMock<mtd::MockInputDeviceObserver> mock_observer;
105
mi::ConfigChanger changer{
106
mt::fake_shared(mock_input_manager),
107
mt::fake_shared(hub),
108
mt::fake_shared(stub_session_container),
109
mt::fake_shared(session_event_sink)
99
112
mi::DeviceCapabilities const keyboard_caps = mi::DeviceCapability::keyboard | mi::DeviceCapability::alpha_numeric;
100
113
mi::DeviceCapabilities const touchpad_caps = mi::DeviceCapability::touchpad | mi::DeviceCapability::pointer;
472
485
mouse_sink_1->handle_input(*motion_4);
475
TEST_F(SingleSeatInputDeviceHubSetup, input_device_changes_sent_to_sink)
488
TEST_F(SingleSeatInputDeviceHubSetup, input_device_changes_sent_to_session)
477
EXPECT_CALL(mock_sink, handle_input_config_change(UnorderedElementsAre(DeviceMatches(device.get_device_info()))));
490
NiceMock<mtd::MockSceneSession> session;
491
stub_session_container.insert_session(mt::fake_shared(session));
493
EXPECT_CALL(session, send_input_config(UnorderedElementsAre(DeviceMatches(device.get_device_info()))));
478
494
hub.add_device(mt::fake_shared(device));
479
495
observer_loop.trigger_server_actions();
482
TEST_F(SingleSeatInputDeviceHubSetup, input_device_changes_sent_to_sink_multiple_devices)
498
TEST_F(SingleSeatInputDeviceHubSetup, input_device_changes_sent_to_session_multiple_devices)
500
NiceMock<mtd::MockSceneSession> session;
501
stub_session_container.insert_session(mt::fake_shared(session));
484
503
hub.add_device(mt::fake_shared(device));
485
504
observer_loop.trigger_server_actions();
487
EXPECT_CALL(mock_sink,
488
handle_input_config_change(UnorderedElementsAre(DeviceMatches(device.get_device_info()),
489
DeviceMatches(another_device.get_device_info()))));
507
send_input_config(UnorderedElementsAre(DeviceMatches(device.get_device_info()),
508
DeviceMatches(another_device.get_device_info()))));
490
509
hub.add_device(mt::fake_shared(another_device));
491
510
observer_loop.trigger_server_actions();
497
516
hub.add_device(mt::fake_shared(another_device));
498
517
observer_loop.trigger_server_actions();
500
EXPECT_CALL(mock_sink,
501
handle_input_config_change(UnorderedElementsAre(DeviceMatches(another_device.get_device_info()))));
519
NiceMock<mtd::MockSceneSession> session;
520
stub_session_container.insert_session(mt::fake_shared(session));
522
send_input_config(UnorderedElementsAre(DeviceMatches(another_device.get_device_info()))));
502
523
hub.remove_device(mt::fake_shared(device));
503
524
observer_loop.trigger_server_actions();