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