Index: content/common/input/input_param_traits_unittest.cc |
diff --git a/content/common/input/input_param_traits_unittest.cc b/content/common/input/input_param_traits_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b00fbad44877adb9c3b9f5ba9ab6688642d01014 |
--- /dev/null |
+++ b/content/common/input/input_param_traits_unittest.cc |
@@ -0,0 +1,211 @@ |
+// Copyright (c) 2013 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 "content/common/input/input_param_traits.h" |
+ |
+#include "content/common/input/event_packet.h" |
+#include "content/common/input/input_event.h" |
+#include "content/common/input/ipc_input_event_payload.h" |
+#include "content/common/input/web_input_event_payload.h" |
+#include "content/common/input_messages.h" |
+#include "ipc/ipc_message.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "third_party/WebKit/public/web/WebInputEvent.h" |
+ |
+namespace content { |
+namespace { |
+ |
+class InputParamTraitsTest : public testing::Test { |
+ protected: |
+ void Compare(const WebInputEventPayload* a, const WebInputEventPayload* b) { |
+ EXPECT_EQ(!!a->web_event(), !!b->web_event()); |
+ if (a->web_event() && b->web_event()) { |
+ const size_t a_size = a->web_event()->size; |
+ ASSERT_EQ(a_size, b->web_event()->size); |
+ EXPECT_EQ(0, memcmp(a->web_event(), b->web_event(), a_size)); |
+ } |
+ EXPECT_EQ(a->latency_info().latency_components.size(), |
+ b->latency_info().latency_components.size()); |
+ EXPECT_EQ(a->is_keyboard_shortcut(), b->is_keyboard_shortcut()); |
+ } |
+ |
+ void Compare(const IPCInputEventPayload* a, const IPCInputEventPayload* b) { |
+ EXPECT_EQ(!!a->message, !!b->message); |
+ if (a->message && b->message) { |
+ EXPECT_EQ(a->message->type(), b->message->type()); |
+ EXPECT_EQ(a->message->routing_id(), b->message->routing_id()); |
+ } |
+ } |
+ |
+ void Compare(const InputEvent::Payload* a, const InputEvent::Payload* b) { |
+ ASSERT_EQ(!!a, !!b); |
+ if (!a) |
+ return; |
+ switch (a->GetType()) { |
+ case InputEvent::Payload::IPC_MESSAGE: |
+ Compare(IPCInputEventPayload::Cast(a), IPCInputEventPayload::Cast(b)); |
+ break; |
+ case InputEvent::Payload::WEB_INPUT_EVENT: |
+ Compare(WebInputEventPayload::Cast(a), WebInputEventPayload::Cast(b)); |
+ default: |
+ break; |
+ } |
+ } |
+ |
+ void Compare(const InputEvent* a, const InputEvent* b) { |
+ EXPECT_EQ(a->id(), b->id()); |
+ EXPECT_EQ(a->valid(), b->valid()); |
+ Compare(a->payload(), b->payload()); |
+ } |
+ |
+ void Compare(const EventPacket* a, const EventPacket* b) { |
+ EXPECT_EQ(a->id(), b->id()); |
+ ASSERT_EQ(a->size(), b->size()); |
+ for (size_t i = 0; i < a->size(); ++i) |
+ Compare(a->events()[i], b->events()[i]); |
+ } |
+ |
+ void Verify(const EventPacket& packet_in) { |
+ IPC::Message msg; |
+ IPC::ParamTraits<EventPacket>::Write(&msg, packet_in); |
+ |
+ EventPacket packet_out; |
+ PickleIterator iter(msg); |
+ EXPECT_TRUE(IPC::ParamTraits<EventPacket>::Read(&msg, &iter, &packet_out)); |
+ |
+ Compare(&packet_in, &packet_out); |
+ |
+ // Perform a sanity check that logging doesn't explode. |
+ std::string packet_in_string; |
+ IPC::ParamTraits<EventPacket>::Log(packet_in, &packet_in_string); |
+ std::string packet_out_string; |
+ IPC::ParamTraits<EventPacket>::Log(packet_out, &packet_out_string); |
+ ASSERT_FALSE(packet_in_string.empty()); |
+ EXPECT_EQ(packet_in_string, packet_out_string); |
+ } |
+}; |
+ |
+TEST_F(InputParamTraitsTest, EventPacketEmpty) { |
+ EventPacket packet_in; |
+ IPC::Message msg; |
+ IPC::ParamTraits<EventPacket>::Write(&msg, packet_in); |
+ |
+ EventPacket packet_out; |
+ PickleIterator iter(msg); |
+ EXPECT_TRUE(IPC::ParamTraits<EventPacket>::Read(&msg, &iter, &packet_out)); |
+ |
+ Compare(&packet_in, &packet_out); |
+} |
+ |
+TEST_F(InputParamTraitsTest, EventPacketUninitializedEvents) { |
+ EventPacket packet_in; |
+ packet_in.set_id(1); |
+ packet_in.Add(InputEvent::Create(1, WebInputEventPayload::Create())); |
+ packet_in.Add(InputEvent::Create(2, IPCInputEventPayload::Create())); |
+ |
+ IPC::Message msg; |
+ IPC::ParamTraits<EventPacket>::Write(&msg, packet_in); |
+ |
+ EventPacket packet_out; |
+ PickleIterator iter(msg); |
+ EXPECT_FALSE(IPC::ParamTraits<EventPacket>::Read(&msg, &iter, &packet_out)); |
+} |
+ |
+TEST_F(InputParamTraitsTest, EventPacketIPCEvents) { |
+ EventPacket packet_in; |
+ packet_in.set_id(1); |
+ |
+ packet_in.Add( |
+ InputEvent::Create(1, |
+ IPCInputEventPayload::Create( |
+ scoped_ptr<IPC::Message>(new InputMsg_Undo(1))))); |
+ packet_in.Add(InputEvent::Create( |
+ 1, |
+ IPCInputEventPayload::Create( |
+ scoped_ptr<IPC::Message>(new InputMsg_SetFocus(2, true))))); |
+ Verify(packet_in); |
+} |
+ |
+TEST_F(InputParamTraitsTest, EventPacketWebInputEvents) { |
+ EventPacket packet_in; |
+ packet_in.set_id(1); |
+ |
+ ui::LatencyInfo latency; |
+ |
+ int64 next_event_id = 1; |
+ WebKit::WebKeyboardEvent key_event; |
+ key_event.type = WebKit::WebInputEvent::RawKeyDown; |
+ key_event.nativeKeyCode = 5; |
+ packet_in.Add(InputEvent::Create( |
+ ++next_event_id, WebInputEventPayload::Create(key_event, latency, true))); |
+ |
+ WebKit::WebMouseWheelEvent wheel_event; |
+ wheel_event.type = WebKit::WebInputEvent::MouseWheel; |
+ wheel_event.deltaX = 10; |
+ latency.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_RWH_COMPONENT, 1, 1); |
+ packet_in.Add(InputEvent::Create( |
+ ++next_event_id, |
+ WebInputEventPayload::Create(wheel_event, latency, false))); |
+ |
+ WebKit::WebMouseEvent mouse_event; |
+ mouse_event.type = WebKit::WebInputEvent::MouseDown; |
+ mouse_event.x = 10; |
+ latency.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 2, 2); |
+ packet_in.Add(InputEvent::Create( |
+ ++next_event_id, |
+ WebInputEventPayload::Create(mouse_event, latency, false))); |
+ |
+ WebKit::WebGestureEvent gesture_event; |
+ gesture_event.type = WebKit::WebInputEvent::GestureScrollBegin; |
+ gesture_event.x = -1; |
+ packet_in.Add(InputEvent::Create( |
+ ++next_event_id, |
+ WebInputEventPayload::Create(gesture_event, latency, false))); |
+ |
+ WebKit::WebTouchEvent touch_event; |
+ touch_event.type = WebKit::WebInputEvent::TouchStart; |
+ touch_event.touchesLength = 1; |
+ touch_event.touches[0].radiusX = 1; |
+ packet_in.Add(InputEvent::Create( |
+ ++next_event_id, |
+ WebInputEventPayload::Create(touch_event, latency, false))); |
+ |
+ Verify(packet_in); |
+} |
+ |
+TEST_F(InputParamTraitsTest, EventPacketMixedEvents) { |
+ EventPacket packet_in; |
+ packet_in.set_id(1); |
+ int64 next_event_id = 1; |
+ |
+ // Add a mix of IPC and WebInputEvents. |
+ packet_in.Add( |
+ InputEvent::Create(++next_event_id, |
+ IPCInputEventPayload::Create( |
+ scoped_ptr<IPC::Message>(new InputMsg_Undo(1))))); |
+ |
+ ui::LatencyInfo latency; |
+ WebKit::WebKeyboardEvent key_event; |
+ key_event.type = WebKit::WebInputEvent::RawKeyDown; |
+ key_event.nativeKeyCode = 5; |
+ packet_in.Add(InputEvent::Create( |
+ ++next_event_id, WebInputEventPayload::Create(key_event, latency, true))); |
+ |
+ packet_in.Add(InputEvent::Create( |
+ ++next_event_id, |
+ IPCInputEventPayload::Create( |
+ scoped_ptr<IPC::Message>(new InputMsg_SetFocus(2, true))))); |
+ |
+ WebKit::WebMouseWheelEvent wheel_event; |
+ wheel_event.type = WebKit::WebInputEvent::MouseWheel; |
+ wheel_event.deltaX = 10; |
+ packet_in.Add(InputEvent::Create( |
+ ++next_event_id, |
+ WebInputEventPayload::Create(wheel_event, latency, false))); |
+ |
+ Verify(packet_in); |
+} |
+ |
+} // namespace |
+} // namespace content |