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