VirtualTouchpad_test.cpp revision e4eec20f6263f4a42ae462456f60ea6c4518bb0a
1804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu#include <cstdio>
2804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu#include <cstdlib>
3804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu#include <cstring>
4804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu#include <gtest/gtest.h>
5804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu#include <linux/input.h>
6804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
7804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu#include "EvdevInjector.h"
8804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu#include "VirtualTouchpad.h"
9804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
10804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liunamespace android {
11804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liunamespace dvr {
12804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
13804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liunamespace {
14804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
15804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liuclass UInputForTesting : public EvdevInjector::UInput {
16804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu public:
17804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  void WriteInputEvent(uint16_t type, uint16_t code, int32_t value) {
18804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    struct input_event event;
19804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    memset(&event, 0, sizeof(event));
20804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    event.type = type;
21804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    event.code = code;
22804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    event.value = value;
23804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    Write(&event, sizeof (event));
24804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  }
25804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu};
26804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
27804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu// Recording test implementation of UInput.
28804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu//
29804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liuclass UInputRecorder : public UInputForTesting {
30804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu public:
31804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  UInputRecorder() {}
32804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  virtual ~UInputRecorder() {}
33804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
34804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  const std::string& GetString() const { return s_; }
35804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  void Reset() { s_.clear(); }
36804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
37804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  // UInput overrides:
38804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
39804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  int Open() override {
40804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    s_ += "o;";
41804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    return 0;
42804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  }
43804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
44804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  int Close() override {
45804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    s_ += "c;";
46804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    return 0;
47804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  }
48804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
49804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  int Write(const void* buf, size_t count) override {
50804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    s_ += "w(";
51804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    s_ += Encode(&count, sizeof(count));
52804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    s_ += ",";
53804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    s_ += Encode(buf, count);
54804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    s_ += ");";
55804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    return 0;
56804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  }
57804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
58804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  int IoctlVoid(int request) override {
59804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    s_ += "i(";
60804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    s_ += Encode(&request, sizeof(request));
61804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    s_ += ");";
62804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    return 0;
63804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  }
64804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
65804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  int IoctlSetInt(int request, int value) override {
66804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    s_ += "i(";
67804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    s_ += Encode(&request, sizeof(request));
68804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    s_ += ",";
69804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    s_ += Encode(&value, sizeof(value));
70804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    s_ += ");";
71804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    return 0;
72804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  }
73804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
74804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu private:
75804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  std::string s_;
76804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
77804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  std::string Encode(const void* buf, size_t count) {
78804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    const char* in = static_cast<const char*>(buf);
79804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    char out[2 * count + 1];
80804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    for (size_t i = 0; i < count; ++i) {
81804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu      snprintf(&out[2 * i], 3, "%02X", in[i]);
82804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    }
83804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    return out;
84804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  }
85804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu};
86804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
87804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liuclass EvdevInjectorForTesting : public EvdevInjector {
88804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu public:
89804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  EvdevInjectorForTesting(UInput& uinput) {
90804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    SetUInputForTesting(&uinput);
91804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  }
92804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  const uinput_user_dev* GetUiDev() const { return GetUiDevForTesting(); }
93804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu};
94804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
95804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liuclass VirtualTouchpadForTesting : public VirtualTouchpad {
96804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu public:
97804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  VirtualTouchpadForTesting(EvdevInjector& injector) {
98804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    SetEvdevInjectorForTesting(&injector);
99804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  }
100804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu};
101804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
102804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liuvoid DumpDifference(const char* expect, const char* actual) {
103804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  printf("  common: ");
104804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  while (*expect && *expect == *actual) {
105804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    putchar(*expect);
106804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    ++expect;
107804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    ++actual;
108804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  }
109804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  printf("\n  expect: %s\n", expect);
110804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  printf("  actual: %s\n", actual);
111804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu}
112804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
113804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu}  // anonymous namespace
114804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
115804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liuclass VirtualTouchpadTest : public testing::Test {
116804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu};
117804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
118804618d0863a5d8ad1b08a846bd5319be864a1cbDoris LiuTEST_F(VirtualTouchpadTest, Goodness) {
119804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  UInputRecorder expect;
120804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  UInputRecorder record;
121804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  EvdevInjectorForTesting injector(record);
122804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  VirtualTouchpadForTesting touchpad(injector);
123804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
124804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  const int initialization_status = touchpad.Initialize();
125804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  EXPECT_EQ(0, initialization_status);
126804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
127804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  // Check some aspects of uinput_user_dev.
128804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  const uinput_user_dev* uidev = injector.GetUiDev();
129804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  for (int i = 0; i < ABS_CNT; ++i) {
130804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    EXPECT_EQ(0, uidev->absmin[i]);
131804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    EXPECT_EQ(0, uidev->absfuzz[i]);
132804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    EXPECT_EQ(0, uidev->absflat[i]);
133804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    if (i != ABS_MT_POSITION_X && i != ABS_MT_POSITION_Y && i != ABS_MT_SLOT) {
134804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu      EXPECT_EQ(0, uidev->absmax[i]);
135804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu    }
136804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  }
137804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  const int32_t width = 1 + uidev->absmax[ABS_MT_POSITION_X];
138804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  const int32_t height = 1 + uidev->absmax[ABS_MT_POSITION_Y];
139804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  const int32_t slots = uidev->absmax[ABS_MT_SLOT];
140804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
141804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  // Check the system calls performed by initialization.
142804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  // From ConfigureBegin():
143804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.Open();
144804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  // From ConfigureInputProperty(INPUT_PROP_DIRECT):
145804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.IoctlSetInt(UI_SET_PROPBIT, INPUT_PROP_DIRECT);
146804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  // From ConfigureMultiTouchXY(0, 0, kWidth - 1, kHeight - 1):
147804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.IoctlSetInt(UI_SET_EVBIT, EV_ABS);
148804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.IoctlSetInt(UI_SET_ABSBIT, ABS_MT_POSITION_X);
149804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.IoctlSetInt(UI_SET_ABSBIT, ABS_MT_POSITION_Y);
150804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  // From ConfigureAbsSlots(kSlots):
151804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.IoctlSetInt(UI_SET_ABSBIT, ABS_MT_SLOT);
152804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  // From ConfigureKey(BTN_TOUCH):
153804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.IoctlSetInt(UI_SET_EVBIT, EV_KEY);
154804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.IoctlSetInt(UI_SET_KEYBIT, BTN_TOUCH);
155804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  // From ConfigureEnd():
156804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.Write(uidev, sizeof (uinput_user_dev));
157804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.IoctlVoid(UI_DEV_CREATE);
158804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  EXPECT_EQ(expect.GetString(), record.GetString());
159804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
160804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.Reset();
161804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  record.Reset();
162804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  int touch_status = touchpad.Touch(0, 0, 0);
163804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  EXPECT_EQ(0, touch_status);
164804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.WriteInputEvent(EV_ABS, ABS_MT_SLOT, 0);
165804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.WriteInputEvent(EV_ABS, ABS_MT_TRACKING_ID, 0);
166804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.WriteInputEvent(EV_ABS, ABS_MT_POSITION_X, 0);
167804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.WriteInputEvent(EV_ABS, ABS_MT_POSITION_Y, 0);
168804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.WriteInputEvent(EV_SYN, SYN_REPORT, 0);
169804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  EXPECT_EQ(expect.GetString(), record.GetString());
170804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
171804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.Reset();
172804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  record.Reset();
173804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  touch_status = touchpad.Touch(0.25f, 0.75f, 0.5f);
174804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  EXPECT_EQ(0, touch_status);
175804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.WriteInputEvent(EV_ABS, ABS_MT_TRACKING_ID, 0);
176804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.WriteInputEvent(EV_ABS, ABS_MT_POSITION_X, 0.25f * width);
177804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.WriteInputEvent(EV_ABS, ABS_MT_POSITION_Y, 0.75f * height);
178804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.WriteInputEvent(EV_KEY, BTN_TOUCH, EvdevInjector::KEY_PRESS);
179804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.WriteInputEvent(EV_SYN, SYN_REPORT, 0);
180804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  EXPECT_EQ(expect.GetString(), record.GetString());
181804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
182804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.Reset();
183804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  record.Reset();
184804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  touch_status = touchpad.Touch(1.0f, 1.0f, 1.0f);
185804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  EXPECT_EQ(0, touch_status);
186804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.WriteInputEvent(EV_ABS, ABS_MT_TRACKING_ID, 0);
187804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.WriteInputEvent(EV_ABS, ABS_MT_POSITION_X, width);
188804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.WriteInputEvent(EV_ABS, ABS_MT_POSITION_Y, height);
189804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.WriteInputEvent(EV_SYN, SYN_REPORT, 0);
190804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  EXPECT_EQ(expect.GetString(), record.GetString());
191804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
192804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.Reset();
193804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  record.Reset();
194804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  touch_status = touchpad.Touch(0.25f, 0.75f, -0.01f);
195804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  EXPECT_EQ(0, touch_status);
196804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.WriteInputEvent(EV_KEY, BTN_TOUCH, EvdevInjector::KEY_RELEASE);
197804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.WriteInputEvent(EV_ABS, ABS_MT_TRACKING_ID, -1);
198804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.WriteInputEvent(EV_SYN, SYN_REPORT, 0);
199804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  EXPECT_EQ(expect.GetString(), record.GetString());
200804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
20185d99528b23b5575d97f614fe25f839d19740abcTeng-Hui Zhu  expect.Reset();
202804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  record.Reset();
203804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu}
204804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
205804618d0863a5d8ad1b08a846bd5319be864a1cbDoris LiuTEST_F(VirtualTouchpadTest, Badness) {
20685d99528b23b5575d97f614fe25f839d19740abcTeng-Hui Zhu  UInputRecorder expect;
207804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  UInputRecorder record;
208804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  EvdevInjectorForTesting injector(record);
209804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  VirtualTouchpadForTesting touchpad(injector);
210804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
211804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  // Touch before initialization should return an error,
212804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  // and should not result in any system calls.
213804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.Reset();
214804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  record.Reset();
215804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  int touch_status = touchpad.Touch(0.25f, 0.75f, -0.01f);
216804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  EXPECT_NE(0, touch_status);
217804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  EXPECT_EQ(expect.GetString(), record.GetString());
218804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
219804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.Reset();
220804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  record.Reset();
221804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  touchpad.Initialize();
222804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
223804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  // Repeated initialization should return an error,
224804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  // and should not result in any system calls.
225804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  expect.Reset();
226804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  record.Reset();
227804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  const int initialization_status = touchpad.Initialize();
228804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  EXPECT_NE(0, initialization_status);
229804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu  EXPECT_EQ(expect.GetString(), record.GetString());
230804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu}
231804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu
232804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu}  // namespace dvr
233804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu}  // namespace android
234804618d0863a5d8ad1b08a846bd5319be864a1cbDoris Liu