VirtualTouchpad_test.cpp revision 3002b8a74431dd7c005269cf9306443a4b4963f1
143b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel#include <android/input.h>
289af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel#include <gtest/gtest.h>
389af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel#include <linux/input.h>
4e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <cstdio>
5e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <cstdlib>
6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <cstring>
7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include "EvdevInjector.h"
989af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel#include "VirtualTouchpadEvdev.h"
10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
11e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace android {
12e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace dvr {
13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace {
15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoclass UInputForTesting : public EvdevInjector::UInput {
17e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public:
183002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  ~UInputForTesting() override {}
19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  void WriteInputEvent(uint16_t type, uint16_t code, int32_t value) {
20e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    struct input_event event;
21e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    memset(&event, 0, sizeof(event));
22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    event.type = type;
23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    event.code = code;
24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    event.value = value;
2589af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel    Write(&event, sizeof(event));
26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
27e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
28e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
29e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Recording test implementation of UInput.
30e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//
31e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoclass UInputRecorder : public UInputForTesting {
32e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public:
33e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  UInputRecorder() {}
343002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  ~UInputRecorder() override {}
35e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
36e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  const std::string& GetString() const { return s_; }
37e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  void Reset() { s_.clear(); }
38e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
39e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // UInput overrides:
40e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
41e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int Open() override {
42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    s_ += "o;";
43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return 0;
44e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
45e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
46e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int Close() override {
47e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    s_ += "c;";
48e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return 0;
49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int Write(const void* buf, size_t count) override {
52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    s_ += "w(";
53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    s_ += Encode(&count, sizeof(count));
54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    s_ += ",";
55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    s_ += Encode(buf, count);
56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    s_ += ");";
57e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return 0;
58e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
60e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int IoctlVoid(int request) override {
61e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    s_ += "i(";
62e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    s_ += Encode(&request, sizeof(request));
63e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    s_ += ");";
64e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return 0;
65e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
66e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
67e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int IoctlSetInt(int request, int value) override {
68e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    s_ += "i(";
69e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    s_ += Encode(&request, sizeof(request));
70e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    s_ += ",";
71e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    s_ += Encode(&value, sizeof(value));
72e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    s_ += ");";
73e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return 0;
74e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
75e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
76e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko private:
77e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::string s_;
78e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
79e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::string Encode(const void* buf, size_t count) {
80e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    const char* in = static_cast<const char*>(buf);
81e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    char out[2 * count + 1];
82e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    for (size_t i = 0; i < count; ++i) {
83e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      snprintf(&out[2 * i], 3, "%02X", in[i]);
84e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
85e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return out;
86e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
87e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
88e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
89e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoclass EvdevInjectorForTesting : public EvdevInjector {
90e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public:
9189af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  EvdevInjectorForTesting(UInput& uinput) { SetUInputForTesting(&uinput); }
92e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  const uinput_user_dev* GetUiDev() const { return GetUiDevForTesting(); }
93e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
94e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
9589af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedelclass VirtualTouchpadForTesting : public VirtualTouchpadEvdev {
96e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public:
9789af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  static sp<VirtualTouchpad> Create(EvdevInjectorForTesting& injector) {
9889af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel    VirtualTouchpadForTesting* const touchpad = new VirtualTouchpadForTesting();
9989af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel    touchpad->SetEvdevInjectorForTesting(&injector);
10089af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel    touchpad->Initialize();
10189af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel    return sp<VirtualTouchpad>(touchpad);
102e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
103e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
104e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
105e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkovoid DumpDifference(const char* expect, const char* actual) {
106e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  printf("  common: ");
107e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  while (*expect && *expect == *actual) {
108e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    putchar(*expect);
109e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    ++expect;
110e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    ++actual;
111e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
112e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  printf("\n  expect: %s\n", expect);
113e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  printf("  actual: %s\n", actual);
114e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
115e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
116e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // anonymous namespace
117e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
11889af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedelclass VirtualTouchpadTest : public testing::Test {};
119e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
120e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST_F(VirtualTouchpadTest, Goodness) {
121e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  UInputRecorder expect;
122e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  UInputRecorder record;
123e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EvdevInjectorForTesting injector(record);
12489af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  sp<VirtualTouchpad> touchpad(VirtualTouchpadForTesting::Create(injector));
125e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
126e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Check some aspects of uinput_user_dev.
127e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  const uinput_user_dev* uidev = injector.GetUiDev();
128e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (int i = 0; i < ABS_CNT; ++i) {
129e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    EXPECT_EQ(0, uidev->absmin[i]);
130e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    EXPECT_EQ(0, uidev->absfuzz[i]);
131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    EXPECT_EQ(0, uidev->absflat[i]);
132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    if (i != ABS_MT_POSITION_X && i != ABS_MT_POSITION_Y && i != ABS_MT_SLOT) {
133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      EXPECT_EQ(0, uidev->absmax[i]);
134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  const int32_t width = 1 + uidev->absmax[ABS_MT_POSITION_X];
137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  const int32_t height = 1 + uidev->absmax[ABS_MT_POSITION_Y];
138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  const int32_t slots = uidev->absmax[ABS_MT_SLOT];
139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Check the system calls performed by initialization.
141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // From ConfigureBegin():
142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.Open();
143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // From ConfigureInputProperty(INPUT_PROP_DIRECT):
144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.IoctlSetInt(UI_SET_PROPBIT, INPUT_PROP_DIRECT);
145e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // From ConfigureMultiTouchXY(0, 0, kWidth - 1, kHeight - 1):
146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.IoctlSetInt(UI_SET_EVBIT, EV_ABS);
147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.IoctlSetInt(UI_SET_ABSBIT, ABS_MT_POSITION_X);
148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.IoctlSetInt(UI_SET_ABSBIT, ABS_MT_POSITION_Y);
149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // From ConfigureAbsSlots(kSlots):
150e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.IoctlSetInt(UI_SET_ABSBIT, ABS_MT_SLOT);
151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // From ConfigureKey(BTN_TOUCH):
152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.IoctlSetInt(UI_SET_EVBIT, EV_KEY);
153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.IoctlSetInt(UI_SET_KEYBIT, BTN_TOUCH);
154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // From ConfigureEnd():
15589af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  expect.Write(uidev, sizeof(uinput_user_dev));
156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.IoctlVoid(UI_DEV_CREATE);
157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expect.GetString(), record.GetString());
158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.Reset();
160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  record.Reset();
1613002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  int touch_status = touchpad->Touch(VirtualTouchpad::PRIMARY, 0, 0, 0);
162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0, touch_status);
163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.WriteInputEvent(EV_ABS, ABS_MT_SLOT, 0);
164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.WriteInputEvent(EV_ABS, ABS_MT_TRACKING_ID, 0);
165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.WriteInputEvent(EV_ABS, ABS_MT_POSITION_X, 0);
166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.WriteInputEvent(EV_ABS, ABS_MT_POSITION_Y, 0);
167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.WriteInputEvent(EV_SYN, SYN_REPORT, 0);
168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expect.GetString(), record.GetString());
169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
170e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.Reset();
171e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  record.Reset();
1723002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  touch_status = touchpad->Touch(VirtualTouchpad::PRIMARY, 0.25f, 0.75f, 0.5f);
173e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0, touch_status);
174e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.WriteInputEvent(EV_ABS, ABS_MT_TRACKING_ID, 0);
175e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.WriteInputEvent(EV_ABS, ABS_MT_POSITION_X, 0.25f * width);
176e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.WriteInputEvent(EV_ABS, ABS_MT_POSITION_Y, 0.75f * height);
177e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.WriteInputEvent(EV_KEY, BTN_TOUCH, EvdevInjector::KEY_PRESS);
178e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.WriteInputEvent(EV_SYN, SYN_REPORT, 0);
179e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expect.GetString(), record.GetString());
180e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
181e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.Reset();
182e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  record.Reset();
1833002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  touch_status = touchpad->Touch(VirtualTouchpad::PRIMARY, 1.0f, 1.0f, 1.0f);
184e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0, touch_status);
185e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.WriteInputEvent(EV_ABS, ABS_MT_TRACKING_ID, 0);
186e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.WriteInputEvent(EV_ABS, ABS_MT_POSITION_X, width);
187e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.WriteInputEvent(EV_ABS, ABS_MT_POSITION_Y, height);
188e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.WriteInputEvent(EV_SYN, SYN_REPORT, 0);
189e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expect.GetString(), record.GetString());
190e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
191e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.Reset();
192e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  record.Reset();
1933002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  touch_status =
1943002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel      touchpad->Touch(VirtualTouchpad::PRIMARY, 0.25f, 0.75f, -0.01f);
195e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0, touch_status);
196e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.WriteInputEvent(EV_KEY, BTN_TOUCH, EvdevInjector::KEY_RELEASE);
197e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.WriteInputEvent(EV_ABS, ABS_MT_TRACKING_ID, -1);
198e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.WriteInputEvent(EV_SYN, SYN_REPORT, 0);
199e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expect.GetString(), record.GetString());
200e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
201e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expect.Reset();
202e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  record.Reset();
2033002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  touch_status = touchpad->ButtonState(VirtualTouchpad::PRIMARY,
2043002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel                                       AMOTION_EVENT_BUTTON_BACK);
20543b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  EXPECT_EQ(0, touch_status);
20643b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  expect.WriteInputEvent(EV_KEY, BTN_BACK, EvdevInjector::KEY_PRESS);
20743b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  expect.WriteInputEvent(EV_SYN, SYN_REPORT, 0);
20843b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  EXPECT_EQ(expect.GetString(), record.GetString());
20943b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel
21043b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  expect.Reset();
21143b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  record.Reset();
2123002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  touch_status = touchpad->ButtonState(VirtualTouchpad::PRIMARY,
2133002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel                                       AMOTION_EVENT_BUTTON_BACK);
21443b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  EXPECT_EQ(0, touch_status);
21543b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  EXPECT_EQ(expect.GetString(), record.GetString());
21643b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel
21743b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  expect.Reset();
21843b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  record.Reset();
2193002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  touch_status = touchpad->ButtonState(VirtualTouchpad::PRIMARY, 0);
22043b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  EXPECT_EQ(0, touch_status);
22143b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  expect.WriteInputEvent(EV_KEY, BTN_BACK, EvdevInjector::KEY_RELEASE);
22243b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  expect.WriteInputEvent(EV_SYN, SYN_REPORT, 0);
22343b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  EXPECT_EQ(expect.GetString(), record.GetString());
22443b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel
22543b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  expect.Reset();
22643b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  record.Reset();
227e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
228e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
229e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST_F(VirtualTouchpadTest, Badness) {
230e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  UInputRecorder expect;
231e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  UInputRecorder record;
232e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EvdevInjectorForTesting injector(record);
2333002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  sp<VirtualTouchpad> touchpad(VirtualTouchpadForTesting::Create(injector));
23443b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel
23543b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  // Touch off-screen should return an error,
23643b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  // and should not result in any system calls.
23743b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  expect.Reset();
23843b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  record.Reset();
2393002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  status_t touch_status =
2403002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel      touchpad->Touch(VirtualTouchpad::PRIMARY, -0.25f, 0.75f, 1.0f);
24189af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  EXPECT_NE(OK, touch_status);
2423002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  touch_status =
2433002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel      touchpad->Touch(VirtualTouchpad::PRIMARY, 0.25f, -0.75f, 1.0f);
24489af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  EXPECT_NE(OK, touch_status);
2453002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  touch_status = touchpad->Touch(VirtualTouchpad::PRIMARY, 1.25f, 0.75f, 1.0f);
24689af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  EXPECT_NE(OK, touch_status);
2473002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  touch_status = touchpad->Touch(VirtualTouchpad::PRIMARY, 0.25f, 1.75f, 1.0f);
24889af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  EXPECT_NE(OK, touch_status);
24943b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  EXPECT_EQ(expect.GetString(), record.GetString());
25043b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel
25143b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  // Unsupported button should return an error,
25243b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  // and should not result in any system calls.
25343b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  expect.Reset();
25443b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  record.Reset();
2553002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  touch_status = touchpad->ButtonState(VirtualTouchpad::PRIMARY,
2563002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel                                       AMOTION_EVENT_BUTTON_FORWARD);
25789af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  EXPECT_NE(OK, touch_status);
25843b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel  EXPECT_EQ(expect.GetString(), record.GetString());
259e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
260e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
261e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace dvr
262e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace android
263