blob: 7235849ce322002113682cf9d2322e4ef64849ba [file] [log] [blame]
// Copyright 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 <stddef.h>
#include <memory>
#include <utility>
#include <vector>
#include "base/memory/ptr_util.h"
#include "content/common/input/input_event.h"
#include "content/common/input_messages.h"
#include "ipc/ipc_message.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/WebKit/public/platform/WebGestureEvent.h"
#include "third_party/WebKit/public/platform/WebInputEvent.h"
#include "third_party/WebKit/public/platform/WebKeyboardEvent.h"
#include "third_party/WebKit/public/platform/WebMouseWheelEvent.h"
#include "third_party/WebKit/public/platform/WebTouchEvent.h"
namespace content {
namespace {
typedef std::vector<std::unique_ptr<InputEvent>> InputEvents;
class InputParamTraitsTest : public testing::Test {
protected:
static void Compare(const InputEvent* a, const InputEvent* 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.get(), b->web_event.get(), a_size));
}
EXPECT_EQ(a->latency_info.latency_components().size(),
b->latency_info.latency_components().size());
}
static void Compare(const InputEvents* a, const InputEvents* b) {
for (size_t i = 0; i < a->size(); ++i)
Compare((*a)[i].get(), (*b)[i].get());
}
static void Verify(const InputEvents& events_in) {
IPC::Message msg;
IPC::ParamTraits<InputEvents>::Write(&msg, events_in);
InputEvents events_out;
base::PickleIterator iter(msg);
EXPECT_TRUE(IPC::ParamTraits<InputEvents>::Read(&msg, &iter, &events_out));
Compare(&events_in, &events_out);
// Perform a sanity check that logging doesn't explode.
std::string events_in_string;
IPC::ParamTraits<InputEvents>::Log(events_in, &events_in_string);
std::string events_out_string;
IPC::ParamTraits<InputEvents>::Log(events_out, &events_out_string);
ASSERT_FALSE(events_in_string.empty());
EXPECT_EQ(events_in_string, events_out_string);
}
};
TEST_F(InputParamTraitsTest, UninitializedEvents) {
InputEvent event;
IPC::Message msg;
IPC::WriteParam(&msg, event);
InputEvent event_out;
base::PickleIterator iter(msg);
EXPECT_FALSE(IPC::ReadParam(&msg, &iter, &event_out));
}
TEST_F(InputParamTraitsTest, InitializedEvents) {
InputEvents events;
ui::LatencyInfo latency;
latency.set_trace_id(5);
blink::WebKeyboardEvent key_event(blink::WebInputEvent::kRawKeyDown,
blink::WebInputEvent::kNoModifiers,
blink::WebInputEvent::kTimeStampForTesting);
key_event.native_key_code = 5;
events.push_back(std::make_unique<InputEvent>(key_event, latency));
blink::WebMouseWheelEvent wheel_event(
blink::WebInputEvent::kMouseWheel, blink::WebInputEvent::kNoModifiers,
blink::WebInputEvent::kTimeStampForTesting);
wheel_event.delta_x = 10;
latency.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT, 1, 1);
events.push_back(std::make_unique<InputEvent>(wheel_event, latency));
blink::WebMouseEvent mouse_event(blink::WebInputEvent::kMouseDown,
blink::WebInputEvent::kNoModifiers,
blink::WebInputEvent::kTimeStampForTesting);
mouse_event.SetPositionInWidget(10, 0);
latency.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 2, 2);
events.push_back(std::make_unique<InputEvent>(mouse_event, latency));
blink::WebGestureEvent gesture_event(
blink::WebInputEvent::kGestureScrollBegin,
blink::WebInputEvent::kNoModifiers,
blink::WebInputEvent::kTimeStampForTesting);
gesture_event.x = -1;
events.push_back(std::make_unique<InputEvent>(gesture_event, latency));
blink::WebTouchEvent touch_event(blink::WebInputEvent::kTouchStart,
blink::WebInputEvent::kNoModifiers,
blink::WebInputEvent::kTimeStampForTesting);
touch_event.touches_length = 1;
touch_event.touches[0].radius_x = 1;
events.push_back(std::make_unique<InputEvent>(touch_event, latency));
Verify(events);
}
} // namespace
} // namespace content