1*9898fa56SBenjamin Tissoires#!/bin/env python3 2*9898fa56SBenjamin Tissoires# SPDX-License-Identifier: GPL-2.0 3*9898fa56SBenjamin Tissoires# -*- coding: utf-8 -*- 4*9898fa56SBenjamin Tissoires# 5*9898fa56SBenjamin Tissoires# Copyright (c) 2019 Benjamin Tissoires <benjamin.tissoires@gmail.com> 6*9898fa56SBenjamin Tissoires# Copyright (c) 2019 Red Hat, Inc. 7*9898fa56SBenjamin Tissoires# 8*9898fa56SBenjamin Tissoires 9*9898fa56SBenjamin Tissoiresfrom .test_keyboard import ArrayKeyboard, TestArrayKeyboard 10*9898fa56SBenjamin Tissoiresfrom hidtools.util import BusType 11*9898fa56SBenjamin Tissoires 12*9898fa56SBenjamin Tissoiresimport libevdev 13*9898fa56SBenjamin Tissoiresimport logging 14*9898fa56SBenjamin Tissoires 15*9898fa56SBenjamin Tissoireslogger = logging.getLogger("hidtools.test.apple-keyboard") 16*9898fa56SBenjamin Tissoires 17*9898fa56SBenjamin TissoiresKERNEL_MODULE = ("apple", "hid-apple") 18*9898fa56SBenjamin Tissoires 19*9898fa56SBenjamin Tissoires 20*9898fa56SBenjamin Tissoiresclass KbdData(object): 21*9898fa56SBenjamin Tissoires pass 22*9898fa56SBenjamin Tissoires 23*9898fa56SBenjamin Tissoires 24*9898fa56SBenjamin Tissoiresclass AppleKeyboard(ArrayKeyboard): 25*9898fa56SBenjamin Tissoires # fmt: off 26*9898fa56SBenjamin Tissoires report_descriptor = [ 27*9898fa56SBenjamin Tissoires 0x05, 0x01, # Usage Page (Generic Desktop) 28*9898fa56SBenjamin Tissoires 0x09, 0x06, # Usage (Keyboard) 29*9898fa56SBenjamin Tissoires 0xa1, 0x01, # Collection (Application) 30*9898fa56SBenjamin Tissoires 0x85, 0x01, # .Report ID (1) 31*9898fa56SBenjamin Tissoires 0x05, 0x07, # .Usage Page (Keyboard) 32*9898fa56SBenjamin Tissoires 0x19, 0xe0, # .Usage Minimum (224) 33*9898fa56SBenjamin Tissoires 0x29, 0xe7, # .Usage Maximum (231) 34*9898fa56SBenjamin Tissoires 0x15, 0x00, # .Logical Minimum (0) 35*9898fa56SBenjamin Tissoires 0x25, 0x01, # .Logical Maximum (1) 36*9898fa56SBenjamin Tissoires 0x75, 0x01, # .Report Size (1) 37*9898fa56SBenjamin Tissoires 0x95, 0x08, # .Report Count (8) 38*9898fa56SBenjamin Tissoires 0x81, 0x02, # .Input (Data,Var,Abs) 39*9898fa56SBenjamin Tissoires 0x75, 0x08, # .Report Size (8) 40*9898fa56SBenjamin Tissoires 0x95, 0x01, # .Report Count (1) 41*9898fa56SBenjamin Tissoires 0x81, 0x01, # .Input (Cnst,Arr,Abs) 42*9898fa56SBenjamin Tissoires 0x75, 0x01, # .Report Size (1) 43*9898fa56SBenjamin Tissoires 0x95, 0x05, # .Report Count (5) 44*9898fa56SBenjamin Tissoires 0x05, 0x08, # .Usage Page (LEDs) 45*9898fa56SBenjamin Tissoires 0x19, 0x01, # .Usage Minimum (1) 46*9898fa56SBenjamin Tissoires 0x29, 0x05, # .Usage Maximum (5) 47*9898fa56SBenjamin Tissoires 0x91, 0x02, # .Output (Data,Var,Abs) 48*9898fa56SBenjamin Tissoires 0x75, 0x03, # .Report Size (3) 49*9898fa56SBenjamin Tissoires 0x95, 0x01, # .Report Count (1) 50*9898fa56SBenjamin Tissoires 0x91, 0x01, # .Output (Cnst,Arr,Abs) 51*9898fa56SBenjamin Tissoires 0x75, 0x08, # .Report Size (8) 52*9898fa56SBenjamin Tissoires 0x95, 0x06, # .Report Count (6) 53*9898fa56SBenjamin Tissoires 0x15, 0x00, # .Logical Minimum (0) 54*9898fa56SBenjamin Tissoires 0x26, 0xff, 0x00, # .Logical Maximum (255) 55*9898fa56SBenjamin Tissoires 0x05, 0x07, # .Usage Page (Keyboard) 56*9898fa56SBenjamin Tissoires 0x19, 0x00, # .Usage Minimum (0) 57*9898fa56SBenjamin Tissoires 0x2a, 0xff, 0x00, # .Usage Maximum (255) 58*9898fa56SBenjamin Tissoires 0x81, 0x00, # .Input (Data,Arr,Abs) 59*9898fa56SBenjamin Tissoires 0xc0, # End Collection 60*9898fa56SBenjamin Tissoires 0x05, 0x0c, # Usage Page (Consumer Devices) 61*9898fa56SBenjamin Tissoires 0x09, 0x01, # Usage (Consumer Control) 62*9898fa56SBenjamin Tissoires 0xa1, 0x01, # Collection (Application) 63*9898fa56SBenjamin Tissoires 0x85, 0x47, # .Report ID (71) 64*9898fa56SBenjamin Tissoires 0x05, 0x01, # .Usage Page (Generic Desktop) 65*9898fa56SBenjamin Tissoires 0x09, 0x06, # .Usage (Keyboard) 66*9898fa56SBenjamin Tissoires 0xa1, 0x02, # .Collection (Logical) 67*9898fa56SBenjamin Tissoires 0x05, 0x06, # ..Usage Page (Generic Device Controls) 68*9898fa56SBenjamin Tissoires 0x09, 0x20, # ..Usage (Battery Strength) 69*9898fa56SBenjamin Tissoires 0x15, 0x00, # ..Logical Minimum (0) 70*9898fa56SBenjamin Tissoires 0x26, 0xff, 0x00, # ..Logical Maximum (255) 71*9898fa56SBenjamin Tissoires 0x75, 0x08, # ..Report Size (8) 72*9898fa56SBenjamin Tissoires 0x95, 0x01, # ..Report Count (1) 73*9898fa56SBenjamin Tissoires 0x81, 0x02, # ..Input (Data,Var,Abs) 74*9898fa56SBenjamin Tissoires 0xc0, # .End Collection 75*9898fa56SBenjamin Tissoires 0xc0, # End Collection 76*9898fa56SBenjamin Tissoires 0x05, 0x0c, # Usage Page (Consumer Devices) 77*9898fa56SBenjamin Tissoires 0x09, 0x01, # Usage (Consumer Control) 78*9898fa56SBenjamin Tissoires 0xa1, 0x01, # Collection (Application) 79*9898fa56SBenjamin Tissoires 0x85, 0x11, # .Report ID (17) 80*9898fa56SBenjamin Tissoires 0x15, 0x00, # .Logical Minimum (0) 81*9898fa56SBenjamin Tissoires 0x25, 0x01, # .Logical Maximum (1) 82*9898fa56SBenjamin Tissoires 0x75, 0x01, # .Report Size (1) 83*9898fa56SBenjamin Tissoires 0x95, 0x03, # .Report Count (3) 84*9898fa56SBenjamin Tissoires 0x81, 0x01, # .Input (Cnst,Arr,Abs) 85*9898fa56SBenjamin Tissoires 0x75, 0x01, # .Report Size (1) 86*9898fa56SBenjamin Tissoires 0x95, 0x01, # .Report Count (1) 87*9898fa56SBenjamin Tissoires 0x05, 0x0c, # .Usage Page (Consumer Devices) 88*9898fa56SBenjamin Tissoires 0x09, 0xb8, # .Usage (Eject) 89*9898fa56SBenjamin Tissoires 0x81, 0x02, # .Input (Data,Var,Abs) 90*9898fa56SBenjamin Tissoires 0x06, 0xff, 0x00, # .Usage Page (Vendor Usage Page 0xff) 91*9898fa56SBenjamin Tissoires 0x09, 0x03, # .Usage (Vendor Usage 0x03) 92*9898fa56SBenjamin Tissoires 0x81, 0x02, # .Input (Data,Var,Abs) 93*9898fa56SBenjamin Tissoires 0x75, 0x01, # .Report Size (1) 94*9898fa56SBenjamin Tissoires 0x95, 0x03, # .Report Count (3) 95*9898fa56SBenjamin Tissoires 0x81, 0x01, # .Input (Cnst,Arr,Abs) 96*9898fa56SBenjamin Tissoires 0x05, 0x0c, # .Usage Page (Consumer Devices) 97*9898fa56SBenjamin Tissoires 0x85, 0x12, # .Report ID (18) 98*9898fa56SBenjamin Tissoires 0x15, 0x00, # .Logical Minimum (0) 99*9898fa56SBenjamin Tissoires 0x25, 0x01, # .Logical Maximum (1) 100*9898fa56SBenjamin Tissoires 0x75, 0x01, # .Report Size (1) 101*9898fa56SBenjamin Tissoires 0x95, 0x01, # .Report Count (1) 102*9898fa56SBenjamin Tissoires 0x09, 0xcd, # .Usage (Play/Pause) 103*9898fa56SBenjamin Tissoires 0x81, 0x02, # .Input (Data,Var,Abs) 104*9898fa56SBenjamin Tissoires 0x09, 0xb3, # .Usage (Fast Forward) 105*9898fa56SBenjamin Tissoires 0x81, 0x02, # .Input (Data,Var,Abs) 106*9898fa56SBenjamin Tissoires 0x09, 0xb4, # .Usage (Rewind) 107*9898fa56SBenjamin Tissoires 0x81, 0x02, # .Input (Data,Var,Abs) 108*9898fa56SBenjamin Tissoires 0x09, 0xb5, # .Usage (Scan Next Track) 109*9898fa56SBenjamin Tissoires 0x81, 0x02, # .Input (Data,Var,Abs) 110*9898fa56SBenjamin Tissoires 0x09, 0xb6, # .Usage (Scan Previous Track) 111*9898fa56SBenjamin Tissoires 0x81, 0x02, # .Input (Data,Var,Abs) 112*9898fa56SBenjamin Tissoires 0x81, 0x01, # .Input (Cnst,Arr,Abs) 113*9898fa56SBenjamin Tissoires 0x81, 0x01, # .Input (Cnst,Arr,Abs) 114*9898fa56SBenjamin Tissoires 0x81, 0x01, # .Input (Cnst,Arr,Abs) 115*9898fa56SBenjamin Tissoires 0x85, 0x13, # .Report ID (19) 116*9898fa56SBenjamin Tissoires 0x15, 0x00, # .Logical Minimum (0) 117*9898fa56SBenjamin Tissoires 0x25, 0x01, # .Logical Maximum (1) 118*9898fa56SBenjamin Tissoires 0x75, 0x01, # .Report Size (1) 119*9898fa56SBenjamin Tissoires 0x95, 0x01, # .Report Count (1) 120*9898fa56SBenjamin Tissoires 0x06, 0x01, 0xff, # .Usage Page (Vendor Usage Page 0xff01) 121*9898fa56SBenjamin Tissoires 0x09, 0x0a, # .Usage (Vendor Usage 0x0a) 122*9898fa56SBenjamin Tissoires 0x81, 0x02, # .Input (Data,Var,Abs) 123*9898fa56SBenjamin Tissoires 0x06, 0x01, 0xff, # .Usage Page (Vendor Usage Page 0xff01) 124*9898fa56SBenjamin Tissoires 0x09, 0x0c, # .Usage (Vendor Usage 0x0c) 125*9898fa56SBenjamin Tissoires 0x81, 0x22, # .Input (Data,Var,Abs,NoPref) 126*9898fa56SBenjamin Tissoires 0x75, 0x01, # .Report Size (1) 127*9898fa56SBenjamin Tissoires 0x95, 0x06, # .Report Count (6) 128*9898fa56SBenjamin Tissoires 0x81, 0x01, # .Input (Cnst,Arr,Abs) 129*9898fa56SBenjamin Tissoires 0x85, 0x09, # .Report ID (9) 130*9898fa56SBenjamin Tissoires 0x09, 0x0b, # .Usage (Vendor Usage 0x0b) 131*9898fa56SBenjamin Tissoires 0x75, 0x08, # .Report Size (8) 132*9898fa56SBenjamin Tissoires 0x95, 0x01, # .Report Count (1) 133*9898fa56SBenjamin Tissoires 0xb1, 0x02, # .Feature (Data,Var,Abs) 134*9898fa56SBenjamin Tissoires 0x75, 0x08, # .Report Size (8) 135*9898fa56SBenjamin Tissoires 0x95, 0x02, # .Report Count (2) 136*9898fa56SBenjamin Tissoires 0xb1, 0x01, # .Feature (Cnst,Arr,Abs) 137*9898fa56SBenjamin Tissoires 0xc0, # End Collection 138*9898fa56SBenjamin Tissoires ] 139*9898fa56SBenjamin Tissoires # fmt: on 140*9898fa56SBenjamin Tissoires 141*9898fa56SBenjamin Tissoires def __init__( 142*9898fa56SBenjamin Tissoires self, 143*9898fa56SBenjamin Tissoires rdesc=report_descriptor, 144*9898fa56SBenjamin Tissoires name="Apple Wireless Keyboard", 145*9898fa56SBenjamin Tissoires input_info=(BusType.BLUETOOTH, 0x05AC, 0x0256), 146*9898fa56SBenjamin Tissoires ): 147*9898fa56SBenjamin Tissoires super().__init__(rdesc, name, input_info) 148*9898fa56SBenjamin Tissoires self.default_reportID = 1 149*9898fa56SBenjamin Tissoires 150*9898fa56SBenjamin Tissoires def send_fn_state(self, state): 151*9898fa56SBenjamin Tissoires data = KbdData() 152*9898fa56SBenjamin Tissoires setattr(data, "0xff0003", state) 153*9898fa56SBenjamin Tissoires r = self.create_report(data, reportID=17) 154*9898fa56SBenjamin Tissoires self.call_input_event(r) 155*9898fa56SBenjamin Tissoires return [r] 156*9898fa56SBenjamin Tissoires 157*9898fa56SBenjamin Tissoires 158*9898fa56SBenjamin Tissoiresclass TestAppleKeyboard(TestArrayKeyboard): 159*9898fa56SBenjamin Tissoires kernel_modules = [KERNEL_MODULE] 160*9898fa56SBenjamin Tissoires 161*9898fa56SBenjamin Tissoires def create_device(self): 162*9898fa56SBenjamin Tissoires return AppleKeyboard() 163*9898fa56SBenjamin Tissoires 164*9898fa56SBenjamin Tissoires def test_single_function_key(self): 165*9898fa56SBenjamin Tissoires """check for function key reliability.""" 166*9898fa56SBenjamin Tissoires uhdev = self.uhdev 167*9898fa56SBenjamin Tissoires evdev = uhdev.get_evdev() 168*9898fa56SBenjamin Tissoires syn_event = self.syn_event 169*9898fa56SBenjamin Tissoires 170*9898fa56SBenjamin Tissoires r = uhdev.event(["F4"]) 171*9898fa56SBenjamin Tissoires expected = [syn_event] 172*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_ALL_APPLICATIONS, 1)) 173*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 174*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 175*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 176*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 1 177*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_FN] == 0 178*9898fa56SBenjamin Tissoires 179*9898fa56SBenjamin Tissoires r = uhdev.event([]) 180*9898fa56SBenjamin Tissoires expected = [syn_event] 181*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_ALL_APPLICATIONS, 0)) 182*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 183*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 184*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 185*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 0 186*9898fa56SBenjamin Tissoires 187*9898fa56SBenjamin Tissoires def test_single_fn_function_key(self): 188*9898fa56SBenjamin Tissoires """check for function key reliability with the fn key.""" 189*9898fa56SBenjamin Tissoires uhdev = self.uhdev 190*9898fa56SBenjamin Tissoires evdev = uhdev.get_evdev() 191*9898fa56SBenjamin Tissoires syn_event = self.syn_event 192*9898fa56SBenjamin Tissoires 193*9898fa56SBenjamin Tissoires r = uhdev.send_fn_state(1) 194*9898fa56SBenjamin Tissoires r.extend(uhdev.event(["F4"])) 195*9898fa56SBenjamin Tissoires expected = [syn_event] 196*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F4, 1)) 197*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 1)) 198*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 199*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 200*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 201*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F4] == 1 202*9898fa56SBenjamin Tissoires 203*9898fa56SBenjamin Tissoires r = uhdev.event([]) 204*9898fa56SBenjamin Tissoires expected = [syn_event] 205*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F4, 0)) 206*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 207*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 208*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 209*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0 210*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_FN] == 1 211*9898fa56SBenjamin Tissoires 212*9898fa56SBenjamin Tissoires r = uhdev.send_fn_state(0) 213*9898fa56SBenjamin Tissoires expected = [syn_event] 214*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 0)) 215*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 216*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 217*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 218*9898fa56SBenjamin Tissoires 219*9898fa56SBenjamin Tissoires def test_single_fn_function_key_release_first(self): 220*9898fa56SBenjamin Tissoires """check for function key reliability with the fn key.""" 221*9898fa56SBenjamin Tissoires uhdev = self.uhdev 222*9898fa56SBenjamin Tissoires evdev = uhdev.get_evdev() 223*9898fa56SBenjamin Tissoires syn_event = self.syn_event 224*9898fa56SBenjamin Tissoires 225*9898fa56SBenjamin Tissoires r = uhdev.send_fn_state(1) 226*9898fa56SBenjamin Tissoires r.extend(uhdev.event(["F4"])) 227*9898fa56SBenjamin Tissoires expected = [syn_event] 228*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F4, 1)) 229*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 1)) 230*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 231*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 232*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 233*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F4] == 1 234*9898fa56SBenjamin Tissoires 235*9898fa56SBenjamin Tissoires r = uhdev.send_fn_state(0) 236*9898fa56SBenjamin Tissoires expected = [syn_event] 237*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 0)) 238*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 239*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 240*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 241*9898fa56SBenjamin Tissoires 242*9898fa56SBenjamin Tissoires r = uhdev.event([]) 243*9898fa56SBenjamin Tissoires expected = [syn_event] 244*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F4, 0)) 245*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 246*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 247*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 248*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0 249*9898fa56SBenjamin Tissoires 250*9898fa56SBenjamin Tissoires def test_single_fn_function_key_inverted(self): 251*9898fa56SBenjamin Tissoires """check for function key reliability with the fn key.""" 252*9898fa56SBenjamin Tissoires uhdev = self.uhdev 253*9898fa56SBenjamin Tissoires evdev = uhdev.get_evdev() 254*9898fa56SBenjamin Tissoires syn_event = self.syn_event 255*9898fa56SBenjamin Tissoires 256*9898fa56SBenjamin Tissoires r = uhdev.event(["F4"]) 257*9898fa56SBenjamin Tissoires r.extend(uhdev.send_fn_state(1)) 258*9898fa56SBenjamin Tissoires expected = [syn_event] 259*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_ALL_APPLICATIONS, 1)) 260*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 1)) 261*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 262*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 263*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 264*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 1 265*9898fa56SBenjamin Tissoires 266*9898fa56SBenjamin Tissoires r = uhdev.event([]) 267*9898fa56SBenjamin Tissoires expected = [syn_event] 268*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_ALL_APPLICATIONS, 0)) 269*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 270*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 271*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 272*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 0 273*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_FN] == 1 274*9898fa56SBenjamin Tissoires 275*9898fa56SBenjamin Tissoires r = uhdev.send_fn_state(0) 276*9898fa56SBenjamin Tissoires expected = [syn_event] 277*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 0)) 278*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 279*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 280*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 281*9898fa56SBenjamin Tissoires 282*9898fa56SBenjamin Tissoires def test_multiple_fn_function_key_release_first(self): 283*9898fa56SBenjamin Tissoires """check for function key reliability with the fn key.""" 284*9898fa56SBenjamin Tissoires uhdev = self.uhdev 285*9898fa56SBenjamin Tissoires evdev = uhdev.get_evdev() 286*9898fa56SBenjamin Tissoires syn_event = self.syn_event 287*9898fa56SBenjamin Tissoires 288*9898fa56SBenjamin Tissoires r = uhdev.send_fn_state(1) 289*9898fa56SBenjamin Tissoires r.extend(uhdev.event(["F4"])) 290*9898fa56SBenjamin Tissoires r.extend(uhdev.event(["F4", "F6"])) 291*9898fa56SBenjamin Tissoires expected = [syn_event] 292*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F4, 1)) 293*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F6, 1)) 294*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 1)) 295*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 296*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 297*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 298*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F4] == 1 299*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F6] == 1 300*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_FN] == 1 301*9898fa56SBenjamin Tissoires 302*9898fa56SBenjamin Tissoires r = uhdev.event(["F6"]) 303*9898fa56SBenjamin Tissoires expected = [syn_event] 304*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F4, 0)) 305*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 306*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 307*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 308*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0 309*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F6] == 1 310*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_FN] == 1 311*9898fa56SBenjamin Tissoires 312*9898fa56SBenjamin Tissoires r = uhdev.send_fn_state(0) 313*9898fa56SBenjamin Tissoires expected = [syn_event] 314*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 0)) 315*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 316*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 317*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 318*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0 319*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F6] == 1 320*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_FN] == 0 321*9898fa56SBenjamin Tissoires 322*9898fa56SBenjamin Tissoires r = uhdev.event([]) 323*9898fa56SBenjamin Tissoires expected = [syn_event] 324*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F6, 0)) 325*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 326*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 327*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 328*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0 329*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F6] == 0 330*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_FN] == 0 331*9898fa56SBenjamin Tissoires 332*9898fa56SBenjamin Tissoires def test_multiple_fn_function_key_release_between(self): 333*9898fa56SBenjamin Tissoires """check for function key reliability with the fn key.""" 334*9898fa56SBenjamin Tissoires uhdev = self.uhdev 335*9898fa56SBenjamin Tissoires evdev = uhdev.get_evdev() 336*9898fa56SBenjamin Tissoires syn_event = self.syn_event 337*9898fa56SBenjamin Tissoires 338*9898fa56SBenjamin Tissoires # press F4 339*9898fa56SBenjamin Tissoires r = uhdev.event(["F4"]) 340*9898fa56SBenjamin Tissoires expected = [syn_event] 341*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_ALL_APPLICATIONS, 1)) 342*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 343*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 344*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 345*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0 346*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 1 347*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F6] == 0 348*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_KBDILLUMUP] == 0 349*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_FN] == 0 350*9898fa56SBenjamin Tissoires 351*9898fa56SBenjamin Tissoires # press Fn key 352*9898fa56SBenjamin Tissoires r = uhdev.send_fn_state(1) 353*9898fa56SBenjamin Tissoires expected = [syn_event] 354*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 1)) 355*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 356*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 357*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 358*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0 359*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 1 360*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F6] == 0 361*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_KBDILLUMUP] == 0 362*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_FN] == 1 363*9898fa56SBenjamin Tissoires 364*9898fa56SBenjamin Tissoires # keep F4 and press F6 365*9898fa56SBenjamin Tissoires r = uhdev.event(["F4", "F6"]) 366*9898fa56SBenjamin Tissoires expected = [syn_event] 367*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F6, 1)) 368*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 369*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 370*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 371*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0 372*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 1 373*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F6] == 1 374*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_KBDILLUMUP] == 0 375*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_FN] == 1 376*9898fa56SBenjamin Tissoires 377*9898fa56SBenjamin Tissoires # keep F4 and F6 378*9898fa56SBenjamin Tissoires r = uhdev.event(["F4", "F6"]) 379*9898fa56SBenjamin Tissoires expected = [] 380*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 381*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 382*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 383*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0 384*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 1 385*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F6] == 1 386*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_KBDILLUMUP] == 0 387*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_FN] == 1 388*9898fa56SBenjamin Tissoires 389*9898fa56SBenjamin Tissoires # release Fn key and all keys 390*9898fa56SBenjamin Tissoires r = uhdev.send_fn_state(0) 391*9898fa56SBenjamin Tissoires r.extend(uhdev.event([])) 392*9898fa56SBenjamin Tissoires expected = [syn_event] 393*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_ALL_APPLICATIONS, 0)) 394*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F6, 0)) 395*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 396*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 397*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 398*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0 399*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 0 400*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_F6] == 0 401*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_KBDILLUMUP] == 0 402*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_FN] == 0 403*9898fa56SBenjamin Tissoires 404*9898fa56SBenjamin Tissoires def test_single_pageup_key_release_first(self): 405*9898fa56SBenjamin Tissoires """check for function key reliability with the [page] up key.""" 406*9898fa56SBenjamin Tissoires uhdev = self.uhdev 407*9898fa56SBenjamin Tissoires evdev = uhdev.get_evdev() 408*9898fa56SBenjamin Tissoires syn_event = self.syn_event 409*9898fa56SBenjamin Tissoires 410*9898fa56SBenjamin Tissoires r = uhdev.send_fn_state(1) 411*9898fa56SBenjamin Tissoires r.extend(uhdev.event(["UpArrow"])) 412*9898fa56SBenjamin Tissoires expected = [syn_event] 413*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_PAGEUP, 1)) 414*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 1)) 415*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 416*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 417*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 418*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_PAGEUP] == 1 419*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_UP] == 0 420*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_FN] == 1 421*9898fa56SBenjamin Tissoires 422*9898fa56SBenjamin Tissoires r = uhdev.send_fn_state(0) 423*9898fa56SBenjamin Tissoires expected = [syn_event] 424*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 0)) 425*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 426*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 427*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 428*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_PAGEUP] == 1 429*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_UP] == 0 430*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_FN] == 0 431*9898fa56SBenjamin Tissoires 432*9898fa56SBenjamin Tissoires r = uhdev.event([]) 433*9898fa56SBenjamin Tissoires expected = [syn_event] 434*9898fa56SBenjamin Tissoires expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_PAGEUP, 0)) 435*9898fa56SBenjamin Tissoires events = uhdev.next_sync_events() 436*9898fa56SBenjamin Tissoires self.debug_reports(r, uhdev, events) 437*9898fa56SBenjamin Tissoires self.assertInputEventsIn(expected, events) 438*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_PAGEUP] == 0 439*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_UP] == 0 440*9898fa56SBenjamin Tissoires assert evdev.value[libevdev.EV_KEY.KEY_FN] == 0 441