Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1441)

Unified Diff: services/ui/input_devices/input_device_unittests.cc

Issue 2196563004: Add tests for InputDeviceServer/InputDeviceClient. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Switch test runner. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « services/ui/input_devices/input_device_server.cc ('k') | services/ui/public/cpp/input_devices/BUILD.gn » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: services/ui/input_devices/input_device_unittests.cc
diff --git a/services/ui/input_devices/input_device_unittests.cc b/services/ui/input_devices/input_device_unittests.cc
new file mode 100644
index 0000000000000000000000000000000000000000..c11c2337c59094ce2f5bdee71d60d7e5301e99b2
--- /dev/null
+++ b/services/ui/input_devices/input_device_unittests.cc
@@ -0,0 +1,198 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/bind.h"
+#include "base/command_line.h"
+#include "base/macros.h"
+#include "base/run_loop.h"
+#include "base/test/test_mock_time_task_runner.h"
+#include "services/ui/input_devices/input_device_server.h"
+#include "services/ui/public/cpp/input_devices/input_device_client.h"
+#include "services/ui/public/interfaces/input_devices/input_device_server.mojom.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/events/devices/device_data_manager.h"
+#include "ui/events/devices/device_hotplug_event_observer.h"
+
+namespace ui {
+
+namespace {
+
+// Helper to place items into a std::vector<T> to provide as input.
+template <class T>
+std::vector<T> AsVector(std::initializer_list<T> input) {
+ return std::vector<T>(input);
+}
+
+// Test client that doesn't register itself as the InputDeviceManager.
+class TestInputDeviceClient : public InputDeviceClient {
+ public:
+ TestInputDeviceClient() : InputDeviceClient(false) {}
+ ~TestInputDeviceClient() override {}
+
+ using InputDeviceClient::GetIntefacePtr;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(TestInputDeviceClient);
+};
+
+class InputDeviceTest : public testing::Test {
+ public:
+ InputDeviceTest() {}
+ ~InputDeviceTest() override {}
+
+ void RunUntilIdle() { task_runner_->RunUntilIdle(); }
+
+ void AddClientAsObserver(TestInputDeviceClient* client) {
+ server_.AddObserver(client->GetIntefacePtr());
+ }
+
+ DeviceHotplugEventObserver* GetHotplugObserver() {
+ return DeviceDataManager::GetInstance();
+ }
+
+ // testing::Test:
+ void SetUp() override {
+ task_runner_ = make_scoped_refptr(new base::TestMockTimeTaskRunner(
+ base::Time::Now(), base::TimeTicks::Now()));
+ message_loop_.SetTaskRunner(task_runner_);
+
+ DeviceDataManager::CreateInstance();
+ server_.RegisterAsObserver();
+ }
+
+ void TearDown() override { DeviceDataManager::DeleteInstance(); }
+
+ private:
+ base::MessageLoop message_loop_;
+ scoped_refptr<base::TestMockTimeTaskRunner> task_runner_;
+ InputDeviceServer server_;
+
+ DISALLOW_COPY_AND_ASSIGN(InputDeviceTest);
+};
+
+} // namespace
+
+TEST_F(InputDeviceTest, DeviceListsComplete) {
+ TestInputDeviceClient client;
+ AddClientAsObserver(&client);
+
+ RunUntilIdle();
+ EXPECT_FALSE(client.AreDeviceListsComplete());
+
+ GetHotplugObserver()->OnDeviceListsComplete();
+
+ // Observer should get notification for device lists complete now.
+ RunUntilIdle();
+ EXPECT_TRUE(client.AreDeviceListsComplete());
+}
+
+TEST_F(InputDeviceTest, DeviceListsCompleteTwoClients) {
+ TestInputDeviceClient client1;
+ AddClientAsObserver(&client1);
+
+ TestInputDeviceClient client2;
+ AddClientAsObserver(&client2);
+
+ RunUntilIdle();
+ EXPECT_FALSE(client1.AreDeviceListsComplete());
+ EXPECT_FALSE(client2.AreDeviceListsComplete());
+
+ GetHotplugObserver()->OnDeviceListsComplete();
+
+ // Both observers should get notifications for device lists complete now.
+ RunUntilIdle();
+ EXPECT_TRUE(client1.AreDeviceListsComplete());
+ EXPECT_TRUE(client2.AreDeviceListsComplete());
+}
+
+TEST_F(InputDeviceTest, AddDevices) {
+ const TouchscreenDevice touchscreen(100, INPUT_DEVICE_INTERNAL, "Touchscreen",
+ gfx::Size(2600, 1700), 3);
+
+ TestInputDeviceClient client;
+ AddClientAsObserver(&client);
+
+ // Add keyboard and mark device lists complete.
+ GetHotplugObserver()->OnTouchscreenDevicesUpdated(AsVector({touchscreen}));
+ GetHotplugObserver()->OnDeviceListsComplete();
+
+ RunUntilIdle();
+ EXPECT_TRUE(client.AreDeviceListsComplete());
+ EXPECT_EQ(1u, client.GetTouchscreenDevices().size());
+ EXPECT_EQ(0u, client.GetKeyboardDevices().size());
+ EXPECT_EQ(0u, client.GetMouseDevices().size());
+ EXPECT_EQ(0u, client.GetTouchpadDevices().size());
+}
+
+TEST_F(InputDeviceTest, AddDeviceAfterComplete) {
+ const InputDevice keyboard1(100, INPUT_DEVICE_INTERNAL, "Keyboard1");
+ const InputDevice keyboard2(200, INPUT_DEVICE_EXTERNAL, "Keyboard2");
+ const InputDevice mouse(300, INPUT_DEVICE_EXTERNAL, "Mouse");
+
+ TestInputDeviceClient client;
+ AddClientAsObserver(&client);
+
+ // Add mouse and mark device lists complete.
+ GetHotplugObserver()->OnKeyboardDevicesUpdated(AsVector({keyboard1}));
+ GetHotplugObserver()->OnDeviceListsComplete();
+
+ RunUntilIdle();
+ EXPECT_TRUE(client.AreDeviceListsComplete());
+ EXPECT_EQ(1lu, client.GetKeyboardDevices().size());
+
+ // Add a second keyboard and a mouse.
+ GetHotplugObserver()->OnMouseDevicesUpdated(AsVector({mouse}));
+ GetHotplugObserver()->OnKeyboardDevicesUpdated(
+ AsVector({keyboard1, keyboard2}));
+
+ RunUntilIdle();
+ EXPECT_EQ(0u, client.GetTouchscreenDevices().size());
+ EXPECT_EQ(2u, client.GetKeyboardDevices().size());
+ EXPECT_EQ(1u, client.GetMouseDevices().size());
+ EXPECT_EQ(0u, client.GetTouchpadDevices().size());
+}
+
+TEST_F(InputDeviceTest, AddThenRemoveDevice) {
+ const InputDevice mouse(100, INPUT_DEVICE_INTERNAL, "Mouse");
+
+ TestInputDeviceClient client;
+ AddClientAsObserver(&client);
+
+ // Add mouse and mark device lists complete.
+ GetHotplugObserver()->OnMouseDevicesUpdated(AsVector({mouse}));
+ GetHotplugObserver()->OnDeviceListsComplete();
+
+ RunUntilIdle();
+ EXPECT_TRUE(client.AreDeviceListsComplete());
+ EXPECT_EQ(1u, client.GetMouseDevices().size());
+
+ // Remove mouse device.
+ GetHotplugObserver()->OnMouseDevicesUpdated(AsVector<InputDevice>({}));
+
+ RunUntilIdle();
+ EXPECT_EQ(0u, client.GetMouseDevices().size());
+}
+
+TEST_F(InputDeviceTest, CheckClientDeviceFields) {
+ const InputDevice touchpad(100, INPUT_DEVICE_INTERNAL, "Touchpad");
+
+ TestInputDeviceClient client;
+ AddClientAsObserver(&client);
+
+ // Add touchpad and mark device lists complete.
+ GetHotplugObserver()->OnTouchpadDevicesUpdated(AsVector({touchpad}));
+ GetHotplugObserver()->OnDeviceListsComplete();
+
+ RunUntilIdle();
+ EXPECT_TRUE(client.AreDeviceListsComplete());
+ EXPECT_EQ(1u, client.GetTouchpadDevices().size());
+
+ // Check the touchpad fields match.
+ const InputDevice& output = client.GetTouchpadDevices()[0];
+ EXPECT_EQ(touchpad.id, output.id);
+ EXPECT_EQ(touchpad.type, output.type);
+ EXPECT_EQ(touchpad.name, output.name);
+}
+
+} // namespace ui
« no previous file with comments | « services/ui/input_devices/input_device_server.cc ('k') | services/ui/public/cpp/input_devices/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698