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